设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 10280|回复: 45

[原创] 无聊,写了个拖拽代码 [复制链接]

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-25 23:11:25 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
一键分享 一键分享
  1. <style>

  2.         .dragArea{
  3.                 background-color:blue;
  4.                 filter:alpha(opacity=50);
  5.                 -moz-opacity:0.5;
  6.         }

  7.         body{
  8.                 margin:0px;
  9.         }
  10. </style>
  11. <body>
  12. <div style="top:0px;left:0px;width:100px;height:100px;position:absolute;background:black;" onselectstart="return false;"
  13. onmousedown="mousedown.apply(this,arguments);">
  14. </div>
  15. </body>
  16. <script type="text/javascript">
  17. /***********************************************************************
  18. *        函数名:startdrag
  19. *        说明:开始一段拖动行为,检查拖动行为的过程和终止并响应相应的事件。
  20. *        参数:
  21. *                parent                DOM对象,拖动所属的父对象,必需是容器,可以为document.body
  22. *                onmove                函数对象,事件,拖动开始后,鼠标移动触发事件
  23. *                onfinish        函数对象,事件,拖动结束时,触发事件一次
  24. *                area                对象,可以缺省,必须包含4个属性top left width height,以指定鼠标移动的有效范围,默认值为parent的全部范围。
  25. ***********************************************************************/

  26.         function startdrag(parent,onmove,onfinish,area)
  27.         {
  28.                 var up,out,over;

  29.                 var divarea=document.createElement("div");
  30.                 if(!area)area={
  31.                         "top":"0px",
  32.                         "left":"0px",
  33.                         "width":"100%",
  34.                         "height":"100%"
  35.                 }
  36.                 divarea.style.position="absolute";
  37.                 divarea.style.top=area.top;
  38.                 divarea.style.left=area.left;
  39.                 divarea.style.width=area.width;
  40.                 divarea.style.height=area.height;
  41.                 divarea.style.overflow="hidden";
  42.                 divarea.style.zIndex="10000";
  43.                 divarea.className="dragArea";
  44.                 parent.appendChild(divarea);


  45.                 if(divarea.attachEvent)
  46.                 {
  47.                         divarea.attachEvent("onmousemove",onmove)
  48.                         document.attachEvent("onmouseup",up=function(){
  49.                                 divarea.detachEvent("onmousemove",onmove);
  50.                                 document.detachEvent("onmouseup",up);
  51.                                 divarea.detachEvent("onmouseout",out);
  52.                                 parent.removeChild(divarea);
  53.                                 onfinish(event||arguments[0]);
  54.                         });
  55.                         divarea.attachEvent("onmouseout",out=function(){
  56.                                 divarea.detachEvent("onmousemove",onmove);
  57.                                 document.detachEvent("onmouseup",up);
  58.                                 divarea.detachEvent("onmouseout",out);
  59.                                 parent.removeChild(divarea);
  60.                                 onfinish(event||arguments[0]);

  61.                         });
  62.                 }

  63.                 else if(divarea.addEventListener)
  64.                 {
  65.                         divarea.addEventListener("mousemove",onmove,true);
  66.                         document.addEventListener("mouseup",up=function(){
  67.                                 divarea.removeEventListener("mousemove",onmove,true);
  68.                                 document.removeEventListener("mouseup",up,true);
  69.                                 divarea.removeEventListener("mouseout",out,true);
  70.                                 parent.removeChild(divarea);
  71.                                 onfinish(event||arguments[0]);
  72.                         },true);
  73.                         divarea.addEventListener("mouseout",out=function(){
  74.                                 //alert("out");
  75.                                 divarea.removeEventListener("mousemove",onmove,true);
  76.                                 document.removeEventListener("mouseup",up,true);
  77.                                 divarea.removeEventListener("mouseout",out,true);
  78.                                 parent.removeChild(divarea);
  79.                                 onfinish(event||arguments[0]);
  80.                         },true);
  81.                 }

  82.         }
  83. </script>
  84. <script type="text/javascript">
  85. function mousedown()
  86. {
  87.         var e=arguments[0]||event;
  88.         var me=this;
  89.         var dy=e.clientY-parseInt(me.style.top);
  90.         var dx=e.clientX-parseInt(me.style.left);
  91.         startdrag(
  92.                 document.body,
  93.                 function(e){
  94.                         e=e||event;
  95.                         if(e.clientY-dy<0||e.clientY-dy>parseInt(document.body.clientHeight)-100)return;
  96.                         if(e.clientX-dx<0||e.clientX-dx>parseInt(document.body.clientWidth)-100)return;
  97.                         me.style.top=e.clientY-dy;
  98.                         me.style.left=e.clientX-dx;
  99.                 },
  100.                 function(e){
  101.                 }
  102.         );
  103. }
  104. </script>
复制代码运行代码另存代码

[php]<style>

        .dragArea{
                background-color:blue;
                filter:alpha(opacity=50);
                -moz-opacity:0.5;
        }

        body{
                margin:0px;
        }
</style>
<body>
<div style="top:0px;left:0px;width:100px;height:100px;position:absolute;background:black;" onselectstart="return false;"
onmousedown="mousedown.apply(this,arguments);">
</div>
</body>
<script type="text/javascript">
/***********************************************************************
*        函数名:startdrag
*        说明:开始一段拖动行为,检查拖动行为的过程和终止并响应相应的事件。
*        参数:
*                parent                DOM对象,拖动所属的父对象,必需是容器,可以为document.body
*                onmove                函数对象,事件,拖动开始后,鼠标移动触发事件
*                onfinish        函数对象,事件,拖动结束时,触发事件一次
*                area                对象,可以缺省,必须包含4个属性top left width height,以指定鼠标移动的有效范围,默认值为parent的全部范围。
***********************************************************************/

        function startdrag(parent,onmove,onfinish,area)
        {
                var up,out,over;

                var divarea=document.createElement("div");
                if(!area)area={
                        "top":"0px",
                        "left":"0px",
                        "width":"100%",
                        "height":"100%"
                }
                divarea.style.position="absolute";
                divarea.style.top=area.top;
                divarea.style.left=area.left;
                divarea.style.width=area.width;
                divarea.style.height=area.height;
                divarea.style.overflow="hidden";
                divarea.style.zIndex="10000";
                divarea.className="dragArea";
                parent.appendChild(divarea);


                if(divarea.attachEvent)
                {
                        divarea.attachEvent("onmousemove",onmove)
                        document.attachEvent("onmouseup",up=function(){
                                divarea.detachEvent("onmousemove",onmove);
                                document.detachEvent("onmouseup",up);
                                divarea.detachEvent("onmouseout",out);
                                parent.removeChild(divarea);
                                onfinish(event||arguments[0]);
                        });
                        divarea.attachEvent("onmouseout",out=function(){
                                divarea.detachEvent("onmousemove",onmove);
                                document.detachEvent("onmouseup",up);
                                divarea.detachEvent("onmouseout",out);
                                parent.removeChild(divarea);
                                onfinish(event||arguments[0]);

                        });
                }

                else if(divarea.addEventListener)
                {
                        divarea.addEventListener("mousemove",onmove,true);
                        document.addEventListener("mouseup",up=function(){
                                divarea.removeEventListener("mousemove",onmove,true);
                                document.removeEventListener("mouseup",up,true);
                                divarea.removeEventListener("mouseout",out,true);
                                parent.removeChild(divarea);
                                onfinish(event||arguments[0]);
                        },true);
                        divarea.addEventListener("mouseout",out=function(){
                                //alert("out");
                                divarea.removeEventListener("mousemove",onmove,true);
                                document.removeEventListener("mouseup",up,true);
                                divarea.removeEventListener("mouseout",out,true);
                                parent.removeChild(divarea);
                                onfinish(event||arguments[0]);
                        },true);
                }

        }
</script>
<script type="text/javascript">
function mousedown()
{
        var e=arguments[0]||event;
        var me=this;
        var dy=e.clientY-parseInt(me.style.top);
        var dx=e.clientX-parseInt(me.style.left);
        startdrag(
                document.body,
                function(e){
                        e=e||event;
                        if(e.clientY-dy<0||e.clientY-dy>parseInt(document.body.clientHeight)-100)return;
                        if(e.clientX-dx<0||e.clientX-dx>parseInt(document.body.clientWidth)-100)return;
                        me.style.top=e.clientY-dy;
                        me.style.left=e.clientX-dx;
                },
                function(e){
                }
        );
}
</script>[/php]
特色是比较封装比较灵活 附件里演示了各种变形 最重要的是 兼容IE6/IE7/FF/OP/SAFARI/NS

[ 本帖最后由 winter 于 2007-12-25 23:23 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?加入无忧
已有 1 人评分威望 收起 理由
biyuan + 10 原创内容

总评分: 威望 + 10   查看全部评分

Rank: 3Rank: 3

升级  49.67%

注册时间
2007-6-4
威望
91
阅读权限
30
积分
349
帖子
89
精华
0
UID
71025
状态
当前离线
发表于 2007-12-25 23:31:06 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
代码写的很棒啊 值得我学习:Q

使用道具 举报

Rank: 2

升级  37.33%

注册时间
2007-4-7
威望
22
阅读权限
20
积分
106
帖子
25
精华
0
UID
67790
状态
当前离线
发表于 2007-12-25 23:53:50 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
最重要的是 兼容IE6/IE7/FF/OP/SAFARI/NS

使用道具 举报

Rank: 3Rank: 3

升级  37.33%

注册时间
2004-2-14
威望
67
阅读权限
30
积分
312
帖子
69
精华
0
UID
8509
状态
当前离线
发表于 2007-12-26 00:42:49 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
你这个有点特色,其它的拖动都会出窗口外而出现滚动条...

你这个在ff下没出现这现象

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-26 00:49:02 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 linkent 于 2007-12-26 00:42 发表
你这个有点特色,其它的拖动都会出窗口外而出现滚动条...

你这个在ff下没出现这现象

这个是在client代码中处理的 library代码只关心拖动时的鼠标行为 被拖动的对象的行为由使用者决定
除了帖出来的这个demo 其他例子我都没有处理滚动条

使用道具 举报

Rank: 2

升级  14%

注册时间
2006-6-25
威望
42
阅读权限
20
积分
71
帖子
26
精华
0
UID
53572
状态
当前离线
发表于 2007-12-26 02:13:38 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
:victory:

使用道具 举报

Rank: 3Rank: 3

升级  24%

注册时间
2005-12-21
威望
123
阅读权限
30
积分
272
帖子
153
精华
0
UID
44543
状态
当前离线
发表于 2007-12-26 09:10:23 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
下载了.谢谢.晚上要好好看一遍.

使用道具 举报

Rank: 6Rank: 6

升级  10.95%

注册时间
2003-4-12
威望
595
阅读权限
70
积分
1219
帖子
592
精华
0
UID
1885
状态
当前离线
发表于 2007-12-26 10:18:10 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
winter 的东西一定要收藏
你叫啊!叫啊!你叫破喉咙也没人救你了!

使用道具 举报

Rank: 6Rank: 6

升级  5.75%

注册时间
2005-6-11
威望
561
阅读权限
70
积分
1115
帖子
548
精华
0
UID
31115
状态
当前离线
发表于 2007-12-26 11:13:46 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
winter 果然强
这个东东应该加精~
blog: http://lzlu.com/

使用道具 举报

Rank: 1

升级  34%

注册时间
2007-12-15
威望
7
阅读权限
10
积分
17
帖子
7
精华
0
UID
80430
状态
当前离线
发表于 2007-12-26 11:47:16 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
如果 我把代码 放在 ASP.NET 里面,然后点击 运行 ,FF 就不能拖动了。

错误控制台 :        onfinish(event||arguments[0]); 报错了

使用道具 举报

Rank: 3Rank: 3

升级  17%

注册时间
2005-6-4
威望
77
阅读权限
30
积分
251
帖子
60
精华
0
UID
30682
状态
当前离线
发表于 2007-12-26 11:54:24 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
看这样操作是否会有些问题哦...
按住不放...触碰到边缘..还是不放,拖动..是否有问题..
我这里IE下是有些问题

使用道具 举报

Rank: 4

升级  52.4%

注册时间
2007-5-11
威望
260
阅读权限
50
积分
762
帖子
261
精华
0
UID
69621
状态
当前离线
发表于 2007-12-26 12:24:50 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
精典。。。
  下载看看了。。
我的博客:http://suiqirui19872005.cnblogs.com

人生格言:开心每一天,幸福每一刻

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-26 14:50:27 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 wlb854854 于 2007-12-26 11:54 发表
看这样操作是否会有些问题哦...
按住不放...触碰到边缘..还是不放,拖动..是否有问题..
我这里IE下是有些问题

谢谢 不过我没测出来 能详细点么? 会出什么样的问题?

使用道具 举报

Rank: 6Rank: 6

升级  30.1%

注册时间
2005-11-7
威望
475
阅读权限
70
积分
1602
帖子
538
精华
0
UID
40667
状态
当前离线
发表于 2007-12-26 16:00:53 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 winter 于 2007-12-26 14:50 发表

谢谢 不过我没测出来 能详细点么? 会出什么样的问题?


IE7 拖动到边缘,按住鼠标不放,继续按原方向拖动,会失去鼠标对拖动层的控制。

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-26 16:21:35 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
哦 明白了 因为没有用setCapture所以我写的这个不允许鼠标移出body范围

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2007-12-26 16:25:10 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
批评一下 :lol
尽量不要用“parent”、“self”等浏览器内置的全局变量名做他用。另外,“out”在某些语言中,也是一个关键字。
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-26 17:33:07 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 Rimifon 于 2007-12-26 16:25 发表
批评一下 :lol
尽量不要用“parent”、“self”等浏览器内置的全局变量名做他用。另外,“out”在某些语言中,也是一个关键字。

局部的 所以粗糙了点:)

使用道具 举报

Rank: 6Rank: 6

升级  2.25%

注册时间
2006-12-27
威望
330
阅读权限
70
积分
1045
帖子
358
精华
0
UID
63180
状态
当前离线
发表于 2007-12-27 08:31:30 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
我是2003的系统和IE6,不知道这个算不算一点不完美的表现,我这里出现了一次不能拖拽到坐标是0,0或者其他的情况,就是在4个角的地方,不能很好的一次定位!:lol :lol
***********^v^*************
        !人懒啥也没留下!
***********^v^*************

使用道具 举报

Rank: 2

升级  0.67%

注册时间
2008-1-7
威望
20
阅读权限
20
积分
51
帖子
17
精华
0
UID
81495
状态
当前离线
发表于 2008-1-8 20:02:45 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
不错 就是在判断浏览器的时候太复杂 可以重载函数
我知道我很菜  所以有什么问题 请随便说

使用道具 举报

Rank: 3Rank: 3

升级  9.33%

注册时间
2007-4-4
威望
113
阅读权限
30
积分
228
帖子
112
精华
0
UID
67572
状态
当前离线
发表于 2008-1-9 18:01:24 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
强啊~~
http://www.AJan.cn

使用道具 举报

您需要登录后才可以回帖 登录 | 加入无忧

Archiver|手机版|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445  

GMT+8, 2012-2-7 21:34 , Processed in 0.077865 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部