YUI3 PR1試用 - 用drag&drop做出填充題
Sat, 01 Nov 2008 00:00:26 +0800恩,其實是用YUI的範例改的,然後稍微調整成我想要做的例子,順便也理解一下drag&drop模組的運用。
廢話不多說,先來看寫好的例子,是一個填充題,可以把答案拖曳到空格中,最後檢查算出分數。
<html> <style> .cls1 {border: solid 1px black;cursor:move; font-size: 13px} .cls2 {text-decoration: underline;} </style> <script src="build/yui/yui-min.js"></script> <script> var quiz = { quiz1: 'the feast of Crispian', quiz2: 'then shall our names', quiz3: 'band of brothers' }; </script> <body> <div> <script> (function(){ for(var i in quiz) { document.write("<span class="cls1" id=""+i+"">"+quiz[i]+"</span> "); } })(); </script> </div><br> <div><input type="button" id="check" value="check" style="visibility:hidden"></div><br> <div style="font-size:13px"> This day is called <span class="cls2" id="quiz1a"> </span>:<br> He that outlives this day, and comes safe home,<br> Will stand a tip-toe when the day is named,<br> And rouse him at the name of Crispian.<br> He that shall live this day, and see old age,<br> Will yearly on the vigil feast his neighbours,<br> And say 'To-morrow is Saint Crispian:'<br> Then will he strip his sleeve and show his scars.<br> And say 'These wounds I had on Crispin's day.'<br> Old men forget: yet all shall be forgot,<br> But he'll remember with advantages<br> What feats he did that day: <span class="cls2" id="quiz2a"> </span>.<br> Familiar in his mouth as household words<br> Harry the king, Bedford and Exeter,<br> Warwick and Talbot, Salisbury and Gloucester,<br> Be in their flowing cups freshly remember'd.<br> This story shall the good man teach his son;<br> And Crispin Crispian shall ne'er go by,<br> From this day to the ending of the world,<br> But we in it shall be remember'd;<br> We few, we happy few, we <span class="cls2" id="quiz3a"> </span>;<br> For he to-day that sheds his blood with me<br> Shall be my brother; be he ne'er so vile,<br> This day shall gentle his condition:<br> And gentlemen in England now a-bed<br> Shall think themselves accursed they were not here,<br> And hold their manhoods cheap whiles any speaks<br> That fought with us upon Saint Crispin's day. </div> <script> YUI().use('dd-drop','dd-proxy',function(Y){ var nodes = Y.all('.cls1'); Y.each(nodes,function(v, k, items) { var drag = new Y.DD.Drag({ node: items.item(k), groups: ['one'], proxy: true, dragMode: 'intersect', moveOnEnd: false }); drag.on('drag:start', function() { var p = this.get('dragNode'); var n = this.get('node'); n.setStyle('opacity', .25); p.set('innerHTML', n.get('innerHTML')); p.setStyle('opacity', .65); p.setStyle('fontSize', '13px'); }); drag.on('drag:end', function() { var n = this.get('node'); n.setStyle('opacity', 1); }); drag.on('drag:drophit', function(e) { e.drop.get('node').set('innerHTML', this.get('node').get('innerHTML')); this.removeFromGroup('one'); this.get('node').setStyle('display','none'); Y.get('#check').setStyle('visibility', 'visible'); }); }); var places = Y.all('.cls2'); Y.each(places,function(v, k, items) { var drop = new Y.DD.Drop({ node: items.item(k), groups: ['one'] }); }); Y.get('#check').on('click', function(e) { var result = 0; Y.each(places, function(v, k, items) { if(v.get('innerHTML') == quiz[v.get('id').substring(0, v.get('id').length-1)]) result++; }); alert("You got " + result + " points"); }); }); </script> </body> </html>
有興趣可以到這個連結看看:http://www.fillano.idv.tw/test342.html
要產生可drag的物件,只要用Y.DD.Drag,把一些設定以及node傳給他的constructor(上例的var drag=new Y.DD.Drag(.....))。Drop也差不多。
使用proxy可以做出一個隨著滑鼠拖曳的proxy,同一個group的drag物件拖曳到drop物件上,就會發生drag:drophit事件(這是在drag-drop裡面定義的)。其他的還有拖曳開始後,拖曳結束後的一些事件處理。簡單寫幾行就可以做出來了。