原生拖放

var dragDom = document.querySelector( ".forDrop" ),
            dropDom = document.querySelector( ".forDrop" );

W.addHandler( dragDom, "dragstart", function ( e ) {
        e.dataTransfer.setData("text","hello zodiac");
        W.log( "dragstart" );
    } );
    W.addHandler( dragDom, "drag", function ( e ) {
        W.log( "drag" );
    } );
    W.addHandler( dragDom, "dragend", function ( e ) {
        W.log( "dragend" );
    } );

W.addHandler( dropDom, "dragenter", function ( e ) {
        W.preventDefault( e );
        W.log( "dragenter" );
    } );
    W.addHandler( dropDom, "dragover", function ( e ) {
        W.preventDefault( e );
        W.log( "dragover" );
    } );
    W.addHandler( dropDom, "drop", function ( e ) {
       var data=e.dataTransfer.getData("text");
        W.preventDefault( e );
        W.log( "drop" );
    } );
    W.addHandler( dropDom, "dragleave", function ( e ) {
        W.preventDefault( e );
        W.log( "dragleave" );
    } );

//包装的拖放

function EventTarget() {
this.handlers = {};
}

EventTarget.prototype = {
constructor : EventTarget,
addHandler : function ( type, handler ) {
if ( typeof this.handlers[type] == "undefined" ) {
this.handlers[type] = [];
}
this.handlers[type].push( handler );
},

fire : function ( event ) {
if ( !event.target ) {
event.target = this;
}
if ( this.handlers[event.type] instanceof Array ) {
var handlers = this.handlers[event.type];
for ( var i = 0, len = handlers.length; i < len; i++ ) {
handlers[i]( event );
}
}
},

removeHandler : function ( type, handler ) {
if ( this.handlers[type] instanceof Array ) {
var handlers = this.handlers[type];
for ( var i = 0, len = handlers.length; i < len; i++ ) {
if ( handlers[i] == handler ) {
break;
}
}
handlers.splice( i, 1 );
}
}
};
var target = new EventTarget();

//添加一个message事件处理器
// target.addHandler("message",handleMessage);

//添加一个message事件处理器
// target.addHandler("message",handleMessage1);

//触发所有message事件处理器
// target.fire({type:"message",message:"Hello World"});

//触发一个message事件处理器
// target.removeHandler("message",handleMessage);

//触发所有message事件处理器
//target.fire({type:"message",message:"Hello World1"});

//endregion

//region拖放
var DragDrop = function () {
var dragDrop = new EventTarget(),
dragging = null,
diffX = 0,
diffY = 0;

function handleEvent( event ) {
//获取事件和对象
event = W.getEvent( event );
var target = W.getEventTarget( event );

//确定事件类型
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 () {
W.addHandler( document, "mousedown", handleEvent );
W.addHandler( document, "mousemove", handleEvent );
W.addHandler( document, "mouseup", handleEvent );
};
dragDrop.disable = function () {
W.removeHandler( document, "mousedown", handleEvent );
W.removeHandler( document, "mousemove", handleEvent );
W.removeHandler( document, "mouseup", handleEvent );
};
return dragDrop;
}();

DragDrop.addHandler( "dragstart", function ( e ) {
W.log( e.x );
} );
DragDrop.addHandler( "drag", function ( e ) {
W.log( e.x );
} );
DragDrop.addHandler( "dragend", function ( e ) {
W.log( e.x );
} );
document.querySelector( ".aa" ).classList.add( "draggable" );
DragDrop.enable();

时间: 2024-10-15 21:56:12

原生拖放的相关文章

《JAVASCRIPT高级程序设计》原生拖放和媒体元素

一.原生拖放 最早在网页中引入javascript拖放功能的是IE4,当时,网页中只有两种对象可以拖放:图像和某些文本.而现在,几乎网页中的任何元素都可以拖放以及作为放置目标.下面介绍一些与拖放相关的内容: 1.拖放事件 在拖放事件中,将依次在被拖动的元素和作为放置目标的元素上触发3个事件: 被拖动的元素:dragstart----drag----dragend 作为放置目标的元素:dragenter----dragover---dragleave(元素被拖出了目标)或drop(元素被放到了放置

深入理解javascript原生拖放

× 目录 [1]拖放源 [2]拖放目标 [3]dataTransfer对象[4]改变光标 前面的话 拖放(drag-and-drop,DnD)其实是两个动作——拖和放.所以,它涉及到两个元素.一个是被拖的元素,称为拖放源:另一个是要放的目标,称为拖放目标.本文将通过拆分这两个概念来详细介绍原生拖放 拖放源 什么样的元素才是拖放源呢? HTML5为所有HTML元素规定了一个draggable属性,表示元素是否可以拖动 图像和链接的draggable属性自动被设置成了true,而其他元素这个属性的默

HTML5原生拖放实例分析

原文链接:http://www.cnblogs.com/zhenwen/p/5855107.html HTML5提供了原生拖放功能的JavaScript API,使用起来很方便. 兼容性: 对于PC端浏览器,Firefox.Chrome.Safari支持良好,而IE和Edge浏览器有些特性不支持,如IE10和IE11.Edge对于dataTransfer.setData(format,data) ,只定义了"text"和"URL"两种有效的数据类型.而HTML5规范

理解javascript原生拖放

拖放源 什么样的元素才是拖放源呢? HTML5为所有HTML元素规定了一个draggable属性,表示元素是否可以拖动 图像和链接的draggable属性自动被设置成了true,而其他元素这个属性的默认值都是false [注意]必须设置draggable='true'才能生效,只设置draggable不起作用 默认情况下,文本只有在被选中的情况下才能拖动,而图像和链接在任何时候都可以拖动.而其他元素则无法被拖放 <input value="文字可拖动"><img al

原生拖放代码

这段js代码会让页面所有position:absolute;的元素可以拖动 var chef = (function(){ var drawDiv,ofstX,ofstY; function fun(event){ var event = event || window.event; var target = event.target || event.srcElement; switch(event.type){ case "mousedown": drawDiv = target;

运用HTML5原生拖动事件(drag)实现拖动效果

拖动效果相信很多朋友都自己写过,不管你用原生JS还是Jquery要实现起来也很简单,但是今天我想介绍的是运用HTML5标准中定义的原生拖动事件实现拖动效果. 一.背景: 其实说是HTML5标准定义,其实最早在IE4中就有拖放功能的API,只是在IE4中,网页中只有两种对象可以拖放:图像和某些文本.并且在IE4中唯一有效的放置目标是文本框.到了IE5.5,拖放功能得到了扩展,让网页中的任何元素都可以拖放.最终HTML5以IE的实力为基础制定了拖放规范.FF3.5+,Safari3+和Chrome根

HTML5新属性-----拖放

最早引入JS拖放功能的是IE4,当时,网页中只有两种对象可以拖放:图像和某些文本.拖动图像时,把鼠标放在图像上,按住鼠标不放就可以拖动它.拖动文本时,需要选中文本,然后可以像拖动图像一样拖动被选中的文本.在IE4中,唯一有效的放置目标是文本框,到了IE5拖放功能得到扩展,添加了新的事件,而且网页中任何元素都可以作为放置目标,IE5.5更进一步,让网页中的任何元素都可以拖放,IE,Firfox3.5,Safari3+,Chrome都实现了原生拖放功能. 一.可拖放属性draggable 默认情况下

js-JavaScript高级程序设计学习笔记14

第十六章 HTML5脚本编程 1.跨文档消息传递.简称XDM,指的是来自不同域的页面间传递消息. XDM的核心是postMessage()方法,接收两个参数,一条消息和消息接收方来自哪个域的字符串. 接收到XDM消息时,会触发window对象的message事件,异步触发. 为保险起见,第一个参数传递字符串.在传入结构化的数据时调用JSON.stringify(),然后在onmessage事件处理程序中调用JSON.parse(). 2.原生拖放 1.拖放事件.拖动元素时,将依次触发dragst

js高程笔记16-20章

第16章 HTML5脚本编程 1.跨文档消息传送XDM:向包含在当前页面的<iframe>元素或由当前页面弹出的窗口传递数据. 原窗口发送:postMessage(内容,目标域名) 目标窗口接收后触发window对象的message事件,event对象的属性有data,origin,source 2.原生拖放: 拖放事件:拖放元素上dragstart,drag,dragend,放置元素上dragenter,dragover,dragleave或者drop dataTransfer对象:even