array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 js学习笔记29----拖拽 - 爱码网

原理:先计算鼠标与拖拽目标的左侧距离 跟 上面距离,再计算拖动后的位置。

示例代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <title>拖拽原理</title>
 5         <meta charset="UTF-8">
 6         <meta name="viewport" content="width=device-width, initial-scale=1">
 7         <style type="text/css">
 8             #moveBlock{
 9                 width:100px;height:100px;background-color:#f00;position:absolute
10             }
11         </style>
12         <script>
13            
14             window.onload = function(){
15                 var oDiv = document.getElementById("moveBlock");
16                 oDiv.onmousedown  = function(ev){
17                     var ev = ev || event;
18                     var disX = ev.clientX - this.offsetLeft; //计算鼠标与当前div左侧距离
19                     var disY = ev.clientY - this.offsetTop; //计算鼠标与当前div顶侧距离
20 
21                     document.onmousemove = function(ev){
22                         var ev = ev || event;
23                         oDiv.style.left = ev.clientX - disX + "px";//计算拖动后与左侧的距离
24                         oDiv.style.top = ev.clientY - disY + "px";//计算拖动后与顶部的距离
25                     }
26 
27                     document.onmouseup = function(){
28                          document.onmousemove = document.onmouseup = null;
29                     }
30                     
31                 }
32             }
33             
34         </script>
35     </head>
36     <body>
37         <div id="moveBlock">
38             
39         </div>
40     </body>
41 </html>

 

我们运行上面的代码如果只是一个单纯的div没什么问题,但是如果同时有文字选中之后,再拖动div会发现有问题。

那是因为当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。

解决方案:
标准:用return false; 阻止事件默认行为
非标准ie :用setCapture()设置全局捕获,当我们给一个元素设置全局捕获以后,那么这个元素就会监听后续发生的所有事情,当有事件发生的时候,就会被当前设置了全局捕获的元素所触发。
 
setCapture()兼容性:
ie : 有,并且有效果
ff : 有,但是没效果
chorme : 没有
 
具体代码如下:
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <title>拖拽改进版</title>
 5         <meta charset="UTF-8">
 6         <meta name="viewport" content="width=device-width, initial-scale=1">
 7         <style type="text/css">
 8             #moveBlock{
 9                 width:100px;height:100px;background-color:#f00;position:absolute
10             }
11         </style>
12         <script>
13            
14             window.onload = function(){
15                 var oDiv = document.getElementById("moveBlock");
16                 oDiv.onmousedown  = function(ev){
17                     var ev = ev || event;
18                     var disX = ev.clientX - this.offsetLeft;
19                     var disY = ev.clientY - this.offsetTop;
20                     //设置全局捕获
21                     if(oDiv.setCapture){
22                         oDiv.setCapture();
23                     }
24 
25                     document.onmousemove = function(ev){
26                         var ev = ev || event;
27                         oDiv.style.left = ev.clientX - disX + "px";
28                         oDiv.style.top = ev.clientY - disY + "px";
29                     }
30 
31                     document.onmouseup = function(){
32                          document.onmousemove = document.onmouseup = null;
33                          //释放事件捕获 releaseCapture();
34                          if(oDiv.releaseCapture){
35                             oDiv.releaseCapture();
36                         }
37                     }
38 
39                    return false; //阻止事件默认行为
40                     
41                 }
42             }
43             
44         </script>
45     </head>
46     <body>
47         <p>
48             原因:当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。<br>
49             解决: 用return false; 阻止事件默认行为.
50         </p>
51         <div id="moveBlock">
52             
53         </div>
54     </body>
55 </html>

 

封装成一个拖拽函数:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <title>拖拽封装</title>
 5         <meta charset="UTF-8">
 6         <meta name="viewport" content="width=device-width, initial-scale=1">
 7         <style type="text/css">
 8             #moveBlock{
 9                 width:100px;height:100px;background-color:#f00;position:absolute
10             }
11         </style>
12         <script>
13            
14             window.onload = function(){
15                 
16                 var oDiv = document.getElementById("moveBlock");
17                 drag(oDiv);
18 
19                 function drag(obj){
20                     obj.onmousedown  = function(ev){
21                         var ev = ev || event;
22                         var disX = ev.clientX - this.offsetLeft;
23                         var disY = ev.clientY - this.offsetTop;
24 
25                         if(obj.setCapture){
26                             obj.setCapture;
27                         }
28 
29                         document.onmousemove = function(ev){
30                             var ev = ev || event;
31                             obj.style.left = ev.clientX - disX + "px";
32                             obj.style.top = ev.clientY - disY + "px";
33                         }
34 
35                         document.onmouseup = function(){
36                             document.onmousemove = document.onmouseup = null;
37                             //释放事件捕获 releaseCapture();
38                             if(obj.releaseCapture){
39                                 obj.releaseCapture();
40                             }
41                         }
42 
43                     return false; //阻止事件默认行为
44                         
45                     }
46                 }
47                 
48             }
49             
50         </script>
51     </head>
52     <body>
53         <p>
54             原因:当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。<br>
55             解决: 用return false; 阻止事件默认行为.
56         </p>
57         <div id="moveBlock">
58             
59         </div>
60     </body>
61 </html>

 

相关文章: