打造自己的js库1 -- dom操作之元素的拖放操作
来源:互联网 发布:游戏源码怎么用 编辑:程序博客网 时间:2024/05/01 19:33
上一节主要说了一下与dom元素相关的基本操作,如选择,设置/获取css属性等等。这节主要说一下dom元素的拖动。
本节拖动是基于上节的基础之上的。用到的原理主要是鼠标的定位以及元素的定位,这里先说一下基本的原理在附上代码。
1.首先我们定义一个拖动类,这里我定义为canDrag也就是说只要有这个类的元素我们都应该让他可以拖动。
2.得到所有类后,我们应该把拖动中和拖动结束处理的能力开发出来留给客户,来提高程序的可扩展性。
程序中鼠标的定位只要用到了e.pageX(ff) 和 e.clientX + document.body.scrollLeft这样处理主要是为了兼容ff和ie等浏览器,而webkit浏览器则出其意料的全部属性都支持。当然这里有值得的一点是文档的头部记得加上<!doctype html>类似的声明。
代码如下:
var extends_ = function(src, dest){for(var i in src){dest[i] = src[i];}};var drag = function(){var nodes = [],currentNode,_callback = {dragComplete : function(srcNode, posi, curIndex){} , dragMoving : function(srcNode, posi, curIndex){srcNode.style["left"] = posi["x"] + "px";srcNode.style["top"] = posi["y"] + "px";}},index = 0;var position = {};var inArray = function(node, arr){for(var i in arr){if(arr[i] === node)return true;}return false;},delegateDrag = function(){var _this = this;//事件绑定Event(document,"mousedown",function(e){var cNode = e.target || e.srcElement;if(!inArray(cNode, _this.nodes)) return false;//指定当前移动的元素_this.currentNode = cNode;_this.currentNode.style["zIndex"] = ++index;position["x"] = e.offsetX;position["y"] = e.offsetY;});Event(document,"mousemove",function(e){//得到位置if(_this.currentNode){var x = e.pageX || e.clientX + document.body.scrollLeft,y = e.pageY || e.clientY + document.body.scrollTop;var posi = {};posi["x"] = x - position["x"];posi["y"] = y - position["y"];_callback.dragMoving(_this.currentNode, posi, index);}});Event(document,"mouseup",function(e){var cNode = e.target || e.srcElement;if(_this.currentNode){var x = e.pageX || e.clientX + document.body.scrollLeft,y = e.pageY || e.clientY + document.body.scrollTop,posi = {};posi["x"] = x - position["x"];posi["y"] = y - position["y"];//$('#console')[0].innerText = "12121212121";_this._callback.dragComplete(_this.currentNode, posi, index);_this.currentNode = null;}});},init = function(obj){//得到所有可以拖动的元素this.nodes = $(".canDrag");//继承自定义方法extends_(obj, _callback);delegateDrag.call(this);};return {nodes : nodes,currentNode : currentNode,_callback : _callback,init : init}}();var Event = function(selector, type, callback, sign){var node = $(selector)[0],addEvent = document.addEventListener ? node.addEventListener : node.attachEvent,type = document.addEventListener ? type : 'on' + type;addEvent.apply(node,[type, callback ,sign]);};
调用的时候非常简单可以直接用drag.init();或者传入自定义函数:
drag.init({dragComplete : function(srcNode, posi, curIndex){} , dragMoving : function(srcNode, posi, curIndex){}});来定义拖动过程。
以上内容均为原创,转载请注明出处,谢谢。如果错误或者疏漏的地方欢迎大家批评指正。
0 0
- 打造自己的js库1 -- dom操作之元素的拖放操作
- 打造自己的js库1 -- dom操作的封装
- 打造自己的js库1 -- ajax操作的封装
- JS的DOM操作元素示例1--删除添加元素
- JS DOM之元素操作
- js操作dom元素的例子
- 原生JS总结1------操作遍历的dom元素
- HTML5实现网页元素的拖放操作
- js-dom元素操作
- JS操作DOM元素
- js的DOM操作
- JS的DOM操作
- JS 的 DOM 操作
- JS的DOM操作
- js对dom对象的操作之select元素:js不能获取select对象
- jQuery的DOM操作之添加元素和删除元素
- jquery的DOM元素操作
- js操作dom元素的属性和方法
- Codeforces 464C Substitutes in Number
- 杂记
- RocketMQ原理解析-consumer 4.长轮询push消息—并发消费消息
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战 08.游戏界面 碰撞检测
- LeetCode-Path Sum
- 打造自己的js库1 -- dom操作之元素的拖放操作
- Javascript推导Y-Combinator (来自Jim Weirich)
- RocketMQ原理解析-consumer 5.push消费-顺序消费消息
- Leetcode之Valid Number
- RocketMQ原理解析-consumer 6.pull消息消费
- RocketMQ原理解析-consumer 7.shutdown
- JDBC中的接口PreparedStatement的用法
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战 09.游戏界面 道具
- RocketMQ原理解析-broker 1. broker的启动