`

popBaseball拖动插件分析

阅读更多
js中call,apply,setCapture,releaseCapture的使用

setCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去,由 document、window、object之类的自行来处理,这样就保证了在拖动的过程中,不会由于经过了其它的元素而受到干扰。另外,还有一个很重 要的事情是,在Win32上,mouse move的事件不是一个连续的,也就是说,并不是我们每次移动1px的鼠标指针,就会发生一个mousemove,windows会周期性检查mouse 的位置变化来产生mousemove的事件。所以,如果是一个很小的页面对象,比如一个直径5px的圆点,如果没有setCapture和 releaseCapture,那么在鼠标按住之后,快速的移动鼠标,就有可能鼠标移动走了,但是小圆点还在原地,就是因为下一次的mousemove事 件已经不再发给这个圆点对象了。


setCapture和releaseCapture的小应用
       web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就不一样了,即使执行很重要的操作,用户一点击浏览器关闭按钮,就将前面操作成果化为乌有.尽管可 以在onunload事件中加些代码,让用户可以选择是否退出,但不能从根本上解决问题!
        前几天,从网上看到setCapture方法,了解了一下,大体是这样的意思,当在IE文档某个区域中使用了这个方法,并且写了onclick或者 onmouse***等有关的鼠标事件方法,那么它就会监视相应的鼠标操作,即使你的鼠标移出了IE,它也一样能捕获到.如果你在某div中的 onclick事件中写了一个alert命令,这时,你点击的关闭按钮,它也一样会弹出alert窗口.releaseCapture与 setCapture方法相反,释放鼠标监控.
        利用这个特性,我们可以延缓IE的关闭窗口等破坏性操作,将一些重要的操作能够在破坏性操作执行之前得到处理.
        有一点遗憾:setCapture和releaseCapture 不支持键盘事件.只对onmousedown, onmouseup, onmousemove, onclick, ondblclick, onmouseover, onmouseout这样的鼠标事件起作用.
        下面是一个小例子,若我们要对divMain这个div元素里面的内容进行保护:
         1). 对divMain执行setCapture方法:
document.getElementById("divMain").setCapture();
2).加入一按钮btnChange,可以进行setCapture和releaseCapture切换,定义一全局变量;
var isFreeze = true;
3).在btnChange的onclick事件中,加入下列代码:
完整代码如下:
<HTML> 
    <head>
        <title>setCapture和releaseCapture的小应用</title>
        <SCRIPT LANGUAGE="JavaScript"> 
        <!--      
            var isFreeze = true;
            
            function click_func()
            {
                if(event.srcElement.id == "divMain")
                {
                    alert("处理中...");                                                            //常规操作
                    document.getElementById("divMain").setCapture();
                }
                else
                {
                    if(isFreeze && event.srcElement.id != "btnChange")
                    {
                        alert('未执行releaseCapture,不能点击');
                        document.getElementById("divMain").setCapture();
                    }
                }
            }
            
            function keydown_func()
            {
                
                if (event.keyCode==115  && event.altKey)            //ALT+F4
                {
                    if(isFreeze)
                    {
                alert('保存!');                                        //可以执行重要操作
               }
            
            //window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
            
                    //return false;
        }
        document.getElementById("divMain").setCapture();
            }
            
            function change_capture(obj)
            {
                isFreeze = !isFreeze;
                if(isFreeze)
                {
                    obj.value = "releaseCapture";
                    document.getElementById("divMain").setCapture();
                }
                else
                {
                    obj.value = "setCapture";
                    alert('保存!');                                    //可以执行重要操作
                    document.getElementById("divMain").releaseCapture();
                }
            }
        //--> 
        </SCRIPT> 
    </head>
    <BODY  onkeydown="keydown_func();"> 
        <div id="divMain" style="width:500px;height:400px;border:1px solid #999;padding:2px" onclick="click_func();">
            点一下IE的菜单或者按钮看看:) 又或者IE窗口外的地方
            <input type="button" value="releaseCapture" onclick="change_capture(this);" id="btnChange">
            <script language="javascript">
                document.getElementById("divMain").setCapture();
            </script>
        </div> 
        
    </BODY> 
</HTML>
注意:该实例仅能应用于IE


jquery拖动插件实例源代码;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>popDraggable</title>
    </head>
    <script type="text/javascript" src="jquery-1.3.2.min.js">
    </script>
    <script type="text/javascript">
        (function($){
            $.fn.draggable = function(s){
                if (this.size() > 1) 
                    return this.each(function(i, o){
                        $(o).draggable(s)
						//s为0对象的子标签
                    });
			
                //包装集里的每个要拖动的对象;
                //h为包装集里要拖动的元素;
                var t = this, h = s ? t.find(s) : t, m = {}, to = false, d = function(v){
                    //禁止冒泡
                    v.stopPropagation();
                    //选项散列对象
                    //提供一些老的位置信息
					console.log(s);	
					console.log(v);
                    m = {
                        ex: v.clientX,
                        ey: v.clientY,
                        x: t.css("position") == "relative" ? parseInt(t.css("left")) : t.position().left,
                        y: t.css("position") == "relative" ? parseInt(t.css("top")) : t.position().top,
                        fw: t.get(0).style.width,
                        w: t.width()
                    };
                    //如果为位置为静态的那么,还是原来的位置,不做处理
                    if (t.css("position") == "static") 
                        to = {
                            "left": m.x,
                            "top": m.y
                        };
					console.log(h);	
					//拖动的里头的子元素
                    //开始拖动	
                    $(document).mousemove(b).mouseup(e);
                    if (document.body.setCapture) 
                        document.body.setCapture();
                    //debug(m)
                }, //计算移动的后的位置;
                //新的鼠标坐标-老的鼠标坐标+老的元素所在文档的位置哦。
                b = function(v){
                    t.css({
                        "left": v.clientX - m.ex + m.x,
                        "top": v.clientY - m.ey + m.y 
                    });
                    
                },        //鼠标松开的时候
                e = function(v){
                    if (document.body.releaseCapture) 
                        document.body.releaseCapture();
                    $(document).unbind("mousemove").unbind("mouseup");
                };
                //开始拖动啦
                h.mousedown(d);
                return t;
                //返回结果包装集;
            };
        })(jQuery);
        
        $(document).ready(function(){
            $(".draggable").draggable("dt:eq(0)")
            $("#left").draggable()
            $("#reletive").draggable()
            $("img").draggable()
            $("#test2").draggable("dt:eq(0)");
			$("#test3").draggable("h2:eq(0)");
        })
        function debug(m){
            document.title = "ex=" + m.ex + " ey=" + m.ey + " x=" + m.x + " y=" + m.y + " fw=" + m.fw + " w=" + m.w;
        }
    </script>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
            cursor: default
        }
        
        body {
            font-size: 11px;
            font-family: Verdana, Geneva, sans-serif;
            width: 100%;
            overflow-x: hidden
        }
        
        #wrap {
            position: relative;
            left: 100px;
            top: 100px;
            width: 1000px
        }
        
        #left {
            width: 200px;
            height: 200px;
            margin-right: 10px;
            float: left;
            background: #003;
        }
        
        #center {
            width: 300px;
            margin-right: 10px;
            float: left;
        }
        
        #right {
            width: 400px;
            margin-right: 10px;
            float: left;
        }
        
        #reletive {
            position: relative;
            left: 50px;
            top: 100px;
            width: 100px;
            height: 100px;
            background: #FC0
        }
        
        .absolute {
            position: absolute;
            width: 200px
        }
        
        .draggable {
            border: solid 1px #eee;
            margin: 5px;
        }
        
        .draggable dt {
            padding: 0 5px;
            font-size: 13px;
            color: #666;
            background: #69C;
            color: #FFF;
            height: 25px;
            line-height: 25px;
            cursor: move
        }
        
        .draggable dt span {
            float: left;
            cursor: move
        }
        
        .draggable dd {
            padding: 5px;
        }
        
        #test2 {
            position: absolute;
            width: 200px;
            border: 1px solid #ccc;
            font-size: 12px;
            line-height: 150%
        }
        
        #test2 dt {
            height: 24px;
            background: green;
            cursor: move;
        }
        
        #test2 dd {
            padding: 10px;
        }
		#test3{border:1px solid #333; width:400px; position:relative;}
		#test3 h2{ background:blue}
		#test3 p{padding:20px}
    </style>
    <body>
        <img src="popeye.jpg" style="position:absolute; z-index:125058687; cursor:move"/>
        <div id="wrap">
            <div id="center">
                <div id="reletive">
                </div>
            </div>
            <div id="right">
                <dl class="draggable absolute">
                    <dt>
                        <span>popDraggable</span>
                    </dt>
                    <dd>
                        drag & drop plugin
                    </dd>
                </dl>
            </div>
        </div>
        <dl id="test2">
            <dt>
                我的标题
            </dt>
            <dd>
                fasfdsdfs
            </dd>
        </dl>
		<div id="test3">
			<h2>我是测试2</h2>
			<p>faks;lfjads;fj fja;sdfj; fj  ;fjsa;fjds</p>
		</div>
    </body>
</html>


传加一些调试信息,协助理解
Object originalEvent=Event mousedown type=mousedown
[h2]
h2:eq(0)
Object originalEvent=Event mousedown type=mousedown
[h2]
h2:eq(0)
Object originalEvent=Event mousedown type=mousedown
[h2]
dt:eq(0)
分享到:
评论
1 楼 momofiona 2010-02-08  

第二版本:http://dl.dropbox.com/u/335315/popeye/popBaseball2/index.html
作者BLOG:
http://user.qzone.qq.com/125058687/blog/1263959350
可恶的Qzone 访问不了,鄙视之

相关推荐

    popBaseball jQuery 拖拽插件 无cookie

    popBaseball是一款基于jQuery的拖拽插件,它允许用户通过拖放操作在网页上进行交互,而无需依赖cookie来存储或追踪用户的行为。这款插件对于创建动态、交互式的Web应用或者游戏非常有用,尤其是那些希望避免使用...

    一款非常好用的拖拽插件

    拖拽插件是一种提高用户交互体验的工具,它允许用户通过简单的鼠标拖放操作来完成文件、数据或元素的移动、复制、粘贴等任务,极大地简化了在计算机或应用程序中的操作流程。在IT领域,拖拽插件广泛应用于各种操作...

    基于jquery+canvas实现的拖动插件

    开发这样的插件对于提升用户体验非常有帮助,尤其是在需要用户交互和操作的场景,如图表拖拽排序、游戏界面元素移动等。同时,这也是学习和理解jQuery、Canvas API以及JavaScript事件处理机制的好实践。通过深入理解...

    jquery.easyDrag.js史上最强大的拖拽插件

    《jQuery.easyDrag.js:探索史上最强大的拖拽插件》 在Web开发中,交互性和用户体验是至关重要的元素,而拖放功能(Drag and Drop)无疑是提升用户体验的有效手段之一。jQuery库以其简洁的API和丰富的插件生态,为...

    拖拽布局插件

    拖拽布局插件是一种在网页或应用程序中实现用户交互式布局设计的工具,它允许用户通过简单的拖放操作来调整元素的位置,以达到自定义界面布局的目的。这种技术广泛应用于移动应用、桌面应用以及各种在线编辑器,为...

    JQ JS javascript layui UI组件 元素 div 拖动插件

    拖动插件是一种常见且实用的增强交互性的工具,它允许用户通过鼠标操作移动页面上的元素,适用于各种场景,如布局调整、窗口管理或数据排序。 首先,jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件...

    Jquery 拖拽插件支出手机端电脑端

    这个“Jquery 拖拽插件支出手机端电脑端”显然是一个跨平台的解决方案,能够适应桌面和移动设备。 首先,让我们详细了解一下jQuery拖拽插件的基本原理。这个插件通过监听鼠标或触摸事件,实现元素的动态拖动效果。...

    jQuery拖拽插件drag.js

    首先,我们要明确jQuery拖拽插件drag.js的核心功能:它允许用户通过鼠标或触摸事件来拖动DOM元素,实现元素在页面上的自由移动。这在创建可自定义布局、拖放排序列表或者构建交互式界面时非常有用。 拖拽插件的工作...

    好用实用的jquery拖拽插件

    **jQuery 拖拽插件详解** 在网页开发中,用户交互性是提升用户体验的关键因素之一,而拖放(Drag and Drop)功能则为交互设计提供了极大的便利。jQuery,作为一个强大的JavaScript库,提供了丰富的API来简化DOM操作...

    谷歌浏览器超级拖拽插件

    谷歌浏览器超级拖拽插件

    jQuery拖拽插件啦啦啦

    "jQuery拖拽插件"是jQuery生态中的一个重要组成部分,它允许开发者轻松实现网页元素的拖放功能,提升用户体验。下面将详细探讨jQuery拖拽插件的相关知识点。 1. **基本原理**: jQuery拖拽插件的工作原理通常是...

    popBaseball

    兼容各个浏览器,jquery 拖拽插件,轻松实现表格拖拽,排序等。。

    dragulajs拖拽插件对移动端兼容很好

    DragulaJS是一款轻量级的JavaScript库,专为实现元素拖放功能而设计。它以其优秀的性能和良好的兼容性在Web开发领域广...通过实践,你将能够熟练掌握这个强大的拖拽插件,并为你的网站或应用添加富有交互性的拖放功能。

    table得列宽拖拽插件

    "table得列宽拖拽插件"正是这样一个工具,它允许用户通过拖拽操作来调整表格(table)中的列宽,以便更好地展示或隐藏内容。这种功能在处理数据密集型的表格时尤为实用,用户可以根据自身需求自由调整列宽,使得重要...

    兼容移动手机的js拖拽插件Draggin.js

    Draggin.js是一款兼容移动手机的js拖拽插件。该js拖拽插件的特点是跨平台,体积小,运行速度快。该js拖拽插件会自动计算元素相对于文档左上角的位置,然后通过CSS transform属性将它重新定位。

    jQuery拖拽插件Shapeshift.zip

    今天,我们将深入探讨一款基于jQuery的拖拽插件——Shapeshift,它允许用户自由地拖动和排列元素,为网页增添生动的动态效果。 Shapeshift v2.0是一款高效且灵活的jQuery插件,特别适用于创建如网格布局、列表视图...

    IE9超级拖拽插件

    如果你知道超级拖拽是什么,那么你可能需要这款IE9插件。 虽然IE9本身自动的“加速器”功能可以实现很多方便的操作,但是很多用户好像还是更加倾向于使用拖拽插件。 这款插件是国内一位高人用C#语言编写的,作者...

    JavaScript弹出窗口拖拽插件

    例如,如何实例化一个可拖动的div元素,以及如何在页面加载后调用这个插件。 总的来说,JavaScript弹出窗口拖拽插件通过JavaScript事件监听机制实现了div元素的拖拽功能,提供了一种灵活且高效的用户交互方式。...

    imageQ图片缩放拖拽jQuery小插件

    **imageQ图片缩放拖拽jQuery小插件详解** 在网页设计中,用户交互体验是至关重要的,而图片作为网页内容的重要组成部分,如何提供便捷、直观的操控方式以提升用户体验呢?`imageQ`就是这样一款基于jQuery的插件,它...

    jQuery拖拽插件制作拖拽排序特效.zip

    jQuery拖拽插件是这个库的一个扩展,它允许用户通过鼠标拖动元素来实现各种交互效果,例如在列表或网格中的拖拽排序。本教程将深入讲解如何利用jQuery制作拖拽排序特效,这将极大地提升用户体验,尤其是在数据管理或...

Global site tag (gtag.js) - Google Analytics