学习YUI.Ext第五日--做拖放Darg&Drop


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中。有空再说。

Javascript 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题分析
Aug 12 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
Oct 09 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
js获取url传值的方法
Dec 18 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
May 06 Javascript
原生JS实现多条件筛选
Aug 19 Javascript
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 #Javascript
学习YUI.Ext 第三天
Mar 10 #Javascript
学习YUI.Ext 第二天
Mar 10 #Javascript
学习YUI.Ext基础第一天
Mar 10 #Javascript
JavaScript触发器详解
Mar 10 #Javascript
又一个图片自动缩小的JS代码
Mar 10 #Javascript
基础的prototype.js常用函数及其用法
Mar 10 #Javascript
You might like
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python简单区块链模拟详解
2019/07/03 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
教师个人自我鉴定
2014/02/08 职场文书
小学生安全责任书
2014/07/25 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
Python学习开发之图形用户界面详解
2021/08/23 Python
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL