DragDrop 拖拽示例

 1.封装兼容事件对象EventUtil

///**************** 封装 EventUtil对象 ***************/
var EU={//EventUtil

addHandler:function(element,type,handler){ //添加事件
if(element.addEventListener){
element.addEventListener(type,handler,false); //使用DOM2级方法添加事件
}else if(element.attachEvent){ //使用IE方法添加事件
element.attachEvent("on"+type,handler);
}else{
element["on"+type]=handler; //使用DOM0级方法添加事件
}
},

removeHandler:function(element,type,handler){ //取消事件
if(element.removeEventListener){
element.removeEventListener(type,handler,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,handler);
}else{
element["on"+type]=null;
}
},

getEvent:function(event){ //使用这个方法跨浏览器取得event对象
return event?event:window.event;
},

//IE浏览器支持window.event.srcElement , 而firefox支持window.event.target;
// event.srcElement从字面上可以看出来有以下关键字:事件,源 他的意思就是:当前事件的源,
// 我们可以调用他的各种属性 就像:document.getElementById("")这样的功能,
getTarget:function(event){ //返回事件的实际目标
return event.target||event.srcElement;
},

preventDefault:function(event){ //阻止事件的默认行为
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue=false;
}
},

stopPropagation:function(event){ //立即停止事件在DOM中的传播
//避免触发注册在document.body上面的事件处理程序
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble=true;
}
},

getRelatedTarget:function(event){ //获取mouseover和mouseout相关元素
if(event.relatedTarget){
return event.relatedTarget;
}else if(event.toElement){ //兼容IE8-
return event.toElement;
}else if(event.formElement){
return event.formElement;
}else{
return null;
}
},

getButton:function(event){ //获取mousedown或mouseup按下或释放的按钮是鼠标中的哪一个
if(document.implementation.hasFeature("MouseEvents","2.0")){
return event.button;
}else{
switch(event.button){ //将IE模型下的button属性映射为DOM模型下的button属性
case 0:
case 1:
case 3:
case 5:
case 7:
return 0; //按下的是鼠标主按钮(一般是左键)
case 2:
case 6:
return 2; //按下的是中间的鼠标按钮
case 4:
return 1; //鼠标次按钮(一般是右键)
}
}
},

getWheelDelta:function(event){ //获取表示鼠标滚轮滚动方向的数值
if(event.wheelDelta){
return event.wheelDelta;
}else{
return -event.detail*40;
}
},

getCharCode:function(event){ //以跨浏览器取得相同的字符编码,需在keypress事件中使用
if(typeof event.charCode=="number"){
return event.charCode;
}else{
return event.keyCode;
}
}
};

2.HTML codes
<p id="status">coordinate:</p>
<div id="myDiv" class="mydiv draggable" style="position:absolute;top:0;left:0;"></div>
3.js codes

//模块模式的单例
var DragDrop = function(){//DragDrop = dragdrop
var dragdrop = new EventTarget();

var dragging = null;
var diffX = 0,diffY = 0;
function handleEvent(event){
event = EU.getEvent(event);//兼容event
var target = EU.getTarget(event);//target 目标

//确定事件类型
switch(event.type){
case 'mousedown':
if(target.className.indexOf("draggable") > -1){
dragging = target;
diffX = event.clientX - target.offsetLeft;
diffY = event.clientY - target.offsetTop;
dragdrop.fire({type:'dragstart',target:dragging,x:event.clientX,y:event.clientY});
}
break;
case 'mousemove':
if(dragging !== null){
//指定位置
dragging.style.left = (event.clientX - diffX) + 'px';
dragging.style.top = (event.clientY - diffY) + 'px';
//触发自定义事件
dragdrop.fire({type:'drag',target:dragging,x:event.clientX,y:event.clientY});
}
break;
case 'mouseup':
dragdrop.fire({type:'dragend',target:dragging,x:event.clientX,y:event.clientY});
dragging = null;
break;
default:
break;
}
}

//公共接口

dragdrop.enable = function(){
EU.addHandler(document,'mousedown',handleEvent);
EU.addHandler(document,'mousemove',handleEvent);
EU.addHandler(document,'mouseup',handleEvent);
};
dragdrop.disable = function(){
EU.removeHandler(document,'mousedown',handleEvent);
EU.removeHandler(document,'mousemove',handleEvent);
EU.removeHandler(document,'mouseup',handleEvent);
}
return dragdrop;
}();


DragDrop.addHandler('dragstart',function(event){
var status = document.getElementById("status");
status.innerHTML = 'started dragging' + event.target.id;
})

DragDrop.addHandler('drag',function(event){
var status = document.getElementById('status');
status.innerHTML += "<br /> Dragged " + event.target.id + "to{"+event.x+","+event.y+"}";

})

DragDrop.addHandler('dragend',function(event){
var status = document.getElementById('status');
status.innerHTML += "<br /> Dragged " + event.target.id + "to{"+event.x+","+event.y+"}";

})



转载于:https://www.cnblogs.com/tangchangcai/p/7756483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值