之前被小伙伴问自己能不能写一个简单的原生的 我稍微犹豫了下  这次重新学习下拖拽的过程  分享下  参考 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的更多相关文章

  1. django项目班笔记-模板抽取

    目录 一.将前端静态文件放置到项目文件目录 二.模板设置 三.将静态文件拖放到项目对应目录 四.检查HTML文件中的应用是否自动更改了 4.1 文件引用没有改变的解决方法 4.2 设置static文件 ...

  2. Vue.js学习笔记(8)拖放

    小颖在目前负责的项目中,负责给同事提供所需组件,在这期间,我们家大颖姐姐让我 写个拖拽组件,一开始我是用click实现,先将你要拖拽的dom点一下,然后再点你要放的位置,这个dom再通过小颖写的方法, ...

  3. nw.js如何处理拖放操作

    nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...

  4. 拖放排序插件Sortable.js

    特点 支持触屏设备和大部分浏览器(IE9以下的就不支持了,原因都懂得) 可以从一个列表容器中拖拽一个列表单元到其他容器或本列表容器中进行排序 移动列表单元时有css动画 支持拖放操作和可选择的文本(这 ...

  5. 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多

    经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...

  6. Table Dragger - 简单的 JS 拖放排序表格插件

    Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...

  7. html5支持drag的拖放排序插件sortable.js

    html5支持drag的拖放排序插件sortable.js <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.5.1/S ...

  8. 关于js拖放功能的实现

    这是具体的拖放代码的HTML,里面依赖两个组件:EventUtil.js是兼容浏览器添加方法的库,EventTarget.js是一个发布-订阅者模式的对象库. EventUtil.js: var Ev ...

  9. 原生JS快速实现拖放

    原生 JS 快速实现拖放 拖放是很常见的一种交互效果,很多时候我们都会借助于第三方的控件来实现,其实用原生 js 实现起来也非常的方便.接下来我们就用原生 js 和 css 快速实现拖放效果 html ...

随机推荐

  1. Netgen mesh library : nglib

    Netgen mesh library : nglib eryar@163.com 摘要Abstract:本文主是对Netgen的库nglib的用法进行介绍.主要参考资料是Netgen用户指南.最后给 ...

  2. JSP网站开发基础总结《二》

    有了上一篇的学习,我相信大家对于JSP一定有了一定的认识,从今天开始我们真正开启JSP模式,如果你有HTML的基础,那学起JSP来也就方便了很多了,首先JSP做为网站开发语言,它与HTML有很多相似的 ...

  3. Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据

         保卫萝卜~场景的思路以及数据的存储.      学习要写笔记,记录自己的步骤. 一.场景构建Tiled      关于Tiled网上有一大堆的教程,这个比较好用,特别是构建塔防类的游戏极其简 ...

  4. PHP API接口测试小工具

    前端时间给手机客户端做接口,当时弱爆了,写完API接口后,也不怎么测试,最后是等客户端调用的时候检验API的正确性. 后面利用PHP的curl实现Post请求,检验API接口的正确性:配合前面做的一个 ...

  5. 新版本来袭:Apache Spark 1.5新特性介绍

    年9月9日发布了1.5版本,该版本由230+开发人员和80+机构参与,修复了1400多个补丁,该版本可以通过 http://spark.apache.org/downloads.html进行下载.Sp ...

  6. 学习使用 CSS3 制作网站面包屑导航效果

    作为最重要的导航展示形式之一,面包屑导航能够让用户更清楚的知道他们所在页面的层次结构,让他们可以方便的导航到上一层页面.在本教程中,您将学习如何使用 CSS3 技术创建自己的面包屑导航效果. 效果演示 ...

  7. JS双月份显示联动效果,点击日期浮出消息提示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. NODE.JS学习的常见误区及四大名著

    NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...

  9. 大数据下的Distinct Count(一):序

    在数据库中,常常会有Distinct Count的操作,比如,查看每一选修课程的人数: select course, count(distinct sid) from stu_table group ...

  10. Elasticsearch之_default_—— 为索引添加默认映射

    前篇说过,ES可以自动为文档设定索引.但是问题也来了——如果默认设置的索引不是我们想要的,该怎么办呢? 要知道ES这种搜索引擎都是以Index为实际的分区,Index里面包含了不同的类型,不同的类型是 ...