拖放 js
之前被小伙伴问自己能不能写一个简单的原生的 我稍微犹豫了下 这次重新学习下拖拽的过程 分享下 参考 JavaScript高级程序设计
必要的准备
自定义事件(实现事件模型)
简单来说事件模型就是观察者模式的一种使用,主体负责发布和管理事件,观察者通过订阅特定的事件类型来观察主体发布的事件,举个例子你有一个按钮,它触发click事件就是在发布事件,事件处理程序就是观察者
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){ //触发特定的事件处理程序 就分别将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+=1) {
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+=1) {
if(handlers[i] == handler) {
break;
}
}
handlers.splice(i,1);
}
}
}
我们可以这样使用上面的事件处理程序
function test() {
alert(1);
}
var target = new EventTarget();
target.addHandler("message",test); //订阅了一个type是message的事件处理函数
target.fire({type:"message"}); //触发该事件 会发现alert1
理解:自定义事件能使我们定义我们自己的事件type,能在我们需要进行交互的时刻触发特定的事件处理程序代码
实现跨浏览器的事件对象EventUtil 参考之前的blog js事件小记
下面来完成拖动的代码
其实简单的理解拖动的过程就是当鼠标mousedown的时候(如果元素可以拖动),让它的绝对定位的left top是鼠标的event.clientX event.clientY 并且在mousemove的时候,时刻去跟随鼠标的位置更新自己的left top 最后在mouseup的时候不让改元素可以移动 我们通过在拖动中加入自定义事件就能够在特定的时刻相应我们的行为,例如网络传输数据,通过页面的元素与用户交互,输出拖动元素的信息等
var DragDrop = function(){
var dragdrop = new EventTarget(),
dragging = null,
diffX = 0,//diffX diffY 是为了处理每次拖动的时候鼠标位置的问题
diffY = 0;
function handlerEvent(event) {
var event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(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;
}
};
dragdrop.enable = function(){
EventUtil.addHandler(document,"mousedown",handlerEvent);
EventUtil.addHandler(document,"mousemove",handlerEvent);
EventUtil.addHandler(document,"mouseup",handlerEvent);
};
dragdrop.disable = function(){
EventUtil.removeHandler(document,"mousedown",handlerEvent);
EventUtil.removeHandler(document,"mousemove",handlerEvent);
EventUtil.removeHandler(document,"mouseup",handlerEvent);
};
return dragdrop;
}();
DragDrop.enable();
上面的例子通过单例的模式,模块化的封装了拖动模块
其他相关点
z-index z-index 只在定位元素上有效果 即除了定位为static的元素
拖放 js的更多相关文章
- django项目班笔记-模板抽取
目录 一.将前端静态文件放置到项目文件目录 二.模板设置 三.将静态文件拖放到项目对应目录 四.检查HTML文件中的应用是否自动更改了 4.1 文件引用没有改变的解决方法 4.2 设置static文件 ...
- Vue.js学习笔记(8)拖放
小颖在目前负责的项目中,负责给同事提供所需组件,在这期间,我们家大颖姐姐让我 写个拖拽组件,一开始我是用click实现,先将你要拖拽的dom点一下,然后再点你要放的位置,这个dom再通过小颖写的方法, ...
- nw.js如何处理拖放操作
nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...
- 拖放排序插件Sortable.js
特点 支持触屏设备和大部分浏览器(IE9以下的就不支持了,原因都懂得) 可以从一个列表容器中拖拽一个列表单元到其他容器或本列表容器中进行排序 移动列表单元时有css动画 支持拖放操作和可选择的文本(这 ...
- 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多
经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...
- Table Dragger - 简单的 JS 拖放排序表格插件
Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...
- html5支持drag的拖放排序插件sortable.js
html5支持drag的拖放排序插件sortable.js <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.5.1/S ...
- 关于js拖放功能的实现
这是具体的拖放代码的HTML,里面依赖两个组件:EventUtil.js是兼容浏览器添加方法的库,EventTarget.js是一个发布-订阅者模式的对象库. EventUtil.js: var Ev ...
- 原生JS快速实现拖放
原生 JS 快速实现拖放 拖放是很常见的一种交互效果,很多时候我们都会借助于第三方的控件来实现,其实用原生 js 实现起来也非常的方便.接下来我们就用原生 js 和 css 快速实现拖放效果 html ...
随机推荐
- java中自动装箱的问题
package wrapper; public class WrapperDemo { public static void main(String[] args) { Integer a=new I ...
- MySQL的学习--用户创建授权
前一段时间,将项目改成SAAS的架构,每个billing account都可以获得一个子域,一个单独的数据库,一个单独的数据库用户和对应数据库的权限. 现在有时间了,将数据库相关的命令用博客备份一下. ...
- win10 svchost.exe (LocalSystemNetworkRestricted)大量读写数据
博主的笔记本联想Y50开机完毕后会不停滴读硬盘/写硬盘,导致开机后一段时间内无法正常使用电脑(硬盘读写高峰期).打开资源监视器发现是"svchost.exe (LocalSystemNetw ...
- testing - 测试基本使用接口
testing - 测试基本使用接口 当你写完一个函数,结构体,main之后,你下一步需要的就是测试了.testing包提供了很简单易用的测试包. 写一个基本的测试用例 测试文件的文件名需要以_tes ...
- nagios监控流量脚本
需求是我们需要对服务器上的流量进行监控,网络上有个流传的check_traffic.sh,它需要被监控机开启snmp.但是感觉都使用上了nagios还要开snmp...有点斧子剪刀一起用的感觉,所以就 ...
- 纯Shading Language绘制HTML5时钟
今天是2014年的最后一天,这个时刻总会让人想起时钟,再过几个小时地球人都要再老了一岁,于是搞个HTML5版的时钟就是我们今天要完成的任务,实现HTML5的时钟绘制一般会采用三种方式,第一种采用CSS ...
- CHARFORMAT2 structure
CHARFORMAT2 structure 包含在丰富的编辑控件中的字符格式设置的信息.charformat2是微软丰富的编辑CHARFORMAT结构2扩展.微软丰富的编辑2允许您使用结构与em_ge ...
- 判断JS对象是否拥有某属性
两种方式,但稍有区别 1.in 运算符
- 在使用vs2012中的MVC4出的错误!类型“System.Data.Entity.DbContext”在未被引用的程序集中定义
理解决方案的nuget程序包2.选中已安装的包,找到EntityFramework,点击管理 由于我是在Taobao_DAL中用到了EF的“数据上下文对象”,他报错了.所以我们要选中它,将EF5.0安 ...
- C#操作 word代码
#region 读取word /// <summary> /// 读取word所有文字内容(不包含表格) /// </summary> /// <returns>w ...