一步一步理解拖拽Drag(二)

简介: 拖拽三部曲:      1、鼠标按下:获取鼠标当前按下的位置,阻止浏览器默认行为,添加监听事件,清除浏览器默认选择的文本,处理IE在容器内的鼠标事件被容器捕获。      2、鼠标移动:获取鼠标位置,设置对象的位置,阻止浏览器默认行为。

拖拽三部曲:
      1、鼠标按下:获取鼠标当前按下的位置,阻止浏览器默认行为,添加监听事件,清除浏览器默认选择的文本,处理IE在容器内的鼠标事件被容器捕获。
      2、鼠标移动:获取鼠标位置,设置对象的位置,阻止浏览器默认行为。
      3、鼠标抬起:移除事件监听。

View Code
  1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <title>一步一步理解拖拽Drag(二)</title>
5 <script type="text/javascript">
6 var base = {
7 getId: function (id) {
8 return document.getElementById(id);
9 },
10 addEvent: function (element, type, fn) {
11 if (element.addEventListener) {
12 element.addEventListener(type, fn, false);
13 }
14 else if (element.attachEvent) {
15 element.attachEvent("on" + type, fn);
16 }
17 else {
18 element["on" + type] = fn;
19 }
20 },
21 removeEvent: function (element, type, fn) {
22 if (element.removeEventListener) {
23 element.removeEventListener(type, fn, false);
24 }
25 else if (element.detachEvent) {
26 element.detachEvent("on" + type, fn);
27 }
28 else {
29 element["on" + type] = null;
30 }
31 },
32 unDefaultEvent: function (event) {
33 if (event && event.preventDefault) {
34 event.preventDefault();
35 }
36 else {
37 event.returnValue = false;
38 }
39 }
40 };
41
42
43 (function () {
44 function Drag(obj) {
45 this.obj = obj;
46 this.disX = this.disY = 0;
47 var _this = this;
48 base.addEvent(obj, "mousedown", function (event) {
49 _this.startDrag(event);
50 });
51 }
52
53 Drag.prototype = {
54
55 startDrag: function (event) {
56 base.unDefaultEvent(event);
57
58 var _this = this;
59
60 this.disX = event.clientX - this.obj.offsetLeft;
61 this.disY = event.clientY - this.obj.offsetTop;
62
63 this.mousemoveHandle = function (event) {
64 _this.move(event);
65 };
66
67 this.mouseupHandle = function () {
68 _this.stopDrag();
69 };
70
71 base.addEvent(document, "mousemove", this.mousemoveHandle);
72
73 base.addEvent(document, "mouseup", this.mouseupHandle);
74
75 if (document.selection && document.selection.empty) {
76 document.selection.empty();
77 }
78 else if (window.getSelection) {
79 window.getSelection().removeAllRanges();
80 }
81
82 if (this.obj.setCapture) {
83 this.obj.setCapture(true);
84 }
85
86 },
87 move: function (event) {
88 base.unDefaultEvent(event);
89 this.obj.style.left = event.clientX - this.disX + "px";
90 this.obj.style.top = event.clientY - this.disY + "px";
91
92 },
93 stopDrag: function () {
94 base.removeEvent(document, "mousemove", this.mousemoveHandle);
95 base.removeEvent(document, "mouseup", this.mouseupHandle);
96
97 if (this.obj.releaseCapture) {
98 this.obj.releaseCapture(true);
99 }
100 }
101 };
102
103 base.addEvent(window, "load", function (event) {
104 var odiv = base.getId("mdiv");
105 var d = new Drag(odiv);
106 });
107
108 })();
109 </script>
110 </head>
111 <body>
112 <div id="mdiv" style="width: 300px; height: 100px; position: absolute; border: 1px solid red;
113 cursor: move">
114 </div>
115 </body>
116 </html>

 

目录
相关文章
|
存储 前端开发 JavaScript
第六章(原理篇) 微前端间的通信机制
第六章(原理篇) 微前端间的通信机制
529 0
|
JavaScript 搜索推荐 前端开发
Vue的SSR 是什么,优缺点分析
Vue的服务器端渲染(SSR)是一种将Vue组件在服务器上执行,并生成完整的HTML页面的技术,这个HTML页面随后被发送至客户端的浏览器进行展示。
|
Linux 网络安全 Python
dash-plotly项目
dash-plotly项目
|
设计模式 Java 关系型数据库
面试官:说说你的项目亮点?
面试官:说说你的项目亮点?
516 0
面试官:说说你的项目亮点?
|
前端开发 JavaScript 架构师
Webpack模块联邦:微前端架构的新选择
Webpack的模块联邦是Webpack 5引入的革命性特性,革新了微前端架构。它允许独立的Web应用在运行时动态共享代码,无需传统打包过程。基本概念包括容器应用(负责加载协调)和远程应用(独立应用,可暴露模块)。实现步骤涉及容器和远程应用的`ModuleFederationPlugin`配置,以及在应用间导入和使用远程模块。模块联邦的优势在于独立开发、按需加载、版本管理和易于维护。通过实战案例展示了如何构建微前端应用,包括创建容器和远程应用,以及消费远程组件。高级用法涉及动态加载、路由集成、状态管理和错误处理。
436 3
|
监控 JavaScript 测试技术
Qt Quick 定时技巧全攻略:从底层原理到高级应用(一)
Qt Quick 定时技巧全攻略:从底层原理到高级应用
651 0
|
存储 消息中间件 缓存
高效并发处理之必备利器:线程池
高效并发处理之必备利器:线程池
234 0
|
网络协议 大数据
基于小米球(Ngrok)实现内网穿透
基于小米球(Ngrok)实现内网穿透
|
Java Maven
Java代码获取汉字的拼音或汉字首字母
今天写项目时,有需要将输入的汉字转化为拼音和提取每个汉字首字母的功能,随手记录分享一下
544 0
|
缓存 前端开发 JavaScript
作为面试官,为什么我推荐微前端作为前端面试的亮点?-3
说说qiankun的资源加载机制(import-html-entry) qiankun import-html-entry 是qiankun 框架中用于加载子应用的 HTML 入口文件的工具函数。它提供了一种方便的方式来动态加载和解析子应用的 HTML 入口文件,并返回一个可以加载子应用的 JavaScript 模块
544 0

热门文章

最新文章