Posted in Javascript onMarch 10, 2007
拖放某个元素Darg&Drop是windows(视窗)问世时的一个重要特征。现在我们要在浏览器里面实现,怎么做呢?先看看基本例子:
YAHOO.example.DDApp = function() { var dd; return { init2: function() { // var dropzone =["dz"]; // for(i in dropzone){ // new YAHOO.util.DDTarget(dropzone[i]); // }; var draggable =["dd_1","dd_2","dd_3"]; //数组存放DargDrop的ID Draggable = function(id, sGroup) { //建立DragDrop对象。这个必须由YAHOO.util.DragDrop的子类来调用 //Sets up the DragDrop object. Must be called in the constructor of any YAHOO.util.DragDrop subclass this.init(id, sGroup); } Draggable.prototype = new YAHOO.util.DD(); //继承父类 Draggable.prototype.startDrag = function(x, y) { YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 0.5); } Draggable.prototype.endDrag = function(e) { //拖放后返回原点 var draggable = this.getEl(); YAHOO.util.Dom.setStyle(draggable, "opacity", 1.0); draggable.style.left = "0px"; draggable.style.top = "0px"; } for(i in draggable){ new Draggable(draggable[i]); } } } } ();注意的地方:
1.这里用了一个数组先收集好所有要DD(Darg&Drop,下同)的元素,再用for遍历new new YAHOO.util.DD()对象,“捆绑”成一类具有相同属性的对象:Draggable。
2.遇到一个无法入手的问题:
用YUI做Dragdrop,如果你的系统开clearType ,移动之后字体会发毛,估计ie内部render的问题 。本来打算用DDProxy代替,但一用DDProxy就无法继承下去。
3.需手工加入xhtml的holder.
ok这个例子暂告一段落,看看一些好玩的(演示):
var correct = { opt0:"ans1", opt1:"ans2", opt2:"ans0" } // 正确答案 var answer = { opt0:"tmp0", opt1:"tmp1", opt2:"tmp2" } // 解答 // ?竦?nbsp; function mark(event) { var points = 0; // var max = 3; // for (key in correct) { points += correct[key] == answer[key] ? 1: 0; } var score = Math.floor(points / max * 100); var result = document.getElementById("result"); result.innerHTML = (score > 70 ? "合格": "不合格") + ":" + score + "%"; } // 初始化 function init(event) { var dropzone = [ "ans0", "ans1", "ans2", // 答案栏 "tmp0", "tmp1", "tmp2" ]; // 临时地方(开始放国旗的地方) for (id in dropzone) { new YAHOO.util.DDTarget(dropzone[id]); } var draggable = [ "opt0", "opt1", "opt2" ]; // 可选项(国旗) Draggable = function(id, sGroup) { this.init(id, sGroup); } Draggable.prototype = new YAHOO.util.DD(); Draggable.prototype.canAccept = function(draggable, dropzone) { if (dropzone.id.match(/^opt[012]$/)) { return false; } for (key in answer) { if (answer[key] == dropzone.id) { return false; } } return true; } Draggable.prototype.startDrag = function(x, y) { YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 0.5); } Draggable.prototype.onDragEnter = function(e, id) { var dropzone = YAHOO.util.DDM.getElement(id); var draggable = this.getEl(); if (this.canAccept(draggable, dropzone)) { dropzone.style.backgroundColor = "orange"; } } Draggable.prototype.onDragOut = function(e, id) { var dropzone = YAHOO.util.DDM.getElement(id); dropzone.style.backgroundColor = "white"; } Draggable.prototype.onDragDrop = function(e, id) { var dropzone = YAHOO.util.DDM.getElement(id); var draggable = this.getEl(); if (this.canAccept(draggable, dropzone)) { dropzone.style.backgroundColor = "white"; dropzone.appendChild(draggable); answer[draggable.id] = dropzone.id; // 解答更新 } } Draggable.prototype.endDrag = function(e) { var draggable = this.getEl(); YAHOO.util.Dom.setStyle(draggable, "opacity", 1.0); draggable.style.left = "0px"; draggable.style.top = "0px"; } for (id in draggable) { new Draggable(draggable[id]); } // 绑定按钮触发事件,计算成绩 YAHOO.util.Event.addListener("submit", "click", mark); } YAHOO.util.Event.addListener(window, "load", init);
如果再把xhtml贴出来,很长 很烦 。look look DEMO.
好,今天到这儿,严重ot中。有空再说。
学习YUI.Ext第五日--做拖放Darg&Drop
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@