• easyui源码翻译1.32--Draggable(拖动)


    前言

    使用$.fn.draggable.defaults重写默认值对象。下载该插件翻译源码

    源码

    /**
     * jQuery EasyUI 1.3.2
     * 
     *翻译:qq 1364386878 --拖动
     */
    (function ($) {
        var dragging = false;
        function drag(e) {
            var target = $.data(e.data.target, "draggable");
            var options = target.options;
            var proxy = target.proxy;
            var dragData = e.data;
            var left = dragData.startLeft + e.pageX - dragData.startX;
            var top = dragData.startTop + e.pageY - dragData.startY;
            if (proxy) {
                if (proxy.parent()[0] == document.body) {
                    if (options.deltaX != null && options.deltaX != undefined) {
                        left = e.pageX + options.deltaX;
                    } else {
                        left = e.pageX - e.data.offsetWidth;
                    }
                    if (options.deltaY != null && options.deltaY != undefined) {
                        top = e.pageY + options.deltaY;
                    } else {
                        top = e.pageY - e.data.offsetHeight;
                    }
                } else {
                    if (options.deltaX != null && options.deltaX != undefined) {
                        left += e.data.offsetWidth + options.deltaX;
                    }
                    if (options.deltaY != null && options.deltaY != undefined) {
                        top += e.data.offsetHeight + options.deltaY;
                    }
                }
            }
            if (e.data.parent != document.body) {
                left += $(e.data.parent).scrollLeft();
                top += $(e.data.parent).scrollTop();
            }
            if (options.axis == "h") {//拖动方向
                dragData.left = left;
            } else {
                if (options.axis == "v") {
                    dragData.top = top;
                } else {
                    dragData.left = left;
                    dragData.top = top;
                }
            }
        };
        
        function applyDrag(e) {
            var Drag = $.data(e.data.target, "draggable");
            var options = Drag.options;
            var proxy = Drag.proxy;
            if (!proxy) {
                proxy = $(e.data.target);
            }
            proxy.css({ left: e.data.left, top: e.data.top });
            $("body").css("cursor", options.cursor);
        };
    
        function doDown(e) {
            dragging = true;
            var Drag = $.data(e.data.target, "draggable");
            var options = Drag.options;
            var droppables = $(".droppable").filter(function () {
                return e.data.target != this;
            }).filter(function () {
                var accept = $.data(this, "droppable").options.accept;
                if (accept) {
                    return $(accept).filter(function () {
                        return this == e.data.target;
                    }).length > 0;
                } else {
                    return true;
                }
            });
            Drag.droppables = droppables;
            var proxy = Drag.proxy;
            if (!proxy) {
                if (options.proxy) {
                    if (options.proxy == "clone") {
                        proxy = $(e.data.target).clone().insertAfter(e.data.target);
                    } else {
                        proxy = options.proxy.call(e.data.target, e.data.target);
                    }
                    Drag.proxy = proxy;
                } else {
                    proxy = $(e.data.target);
                }
            }
            proxy.css("position", "absolute");
            drag(e);
            applyDrag(e);
            options.onStartDrag.call(e.data.target, e);
            return false;
        };
    
        function doMove(e) {
            var Dtarget = $.data(e.data.target, "draggable");
            drag(e);
            if (Dtarget.options.onDrag.call(e.data.target, e) != false) {
                applyDrag(e);
            }
            var source = e.data.target;
            Dtarget.droppables.each(function () {
                var dropObj = $(this);
                if (dropObj.droppable("options").disabled) {
                    return;
                }
                var p2 = dropObj.offset();
                if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()) {
                    if (!this.entered) {
                        $(this).trigger("_dragenter", [source]);
                        this.entered = true;
                    }
                    $(this).trigger("_dragover", [source]);
                } else {
                    if (this.entered) {
                        $(this).trigger("_dragleave", [source]);
                        this.entered = false;
                    }
                }
            });
            return false;
        };
    
        function doUp(e) {
            dragging = false;
            doMove(e);
            var DragObj = $.data(e.data.target, "draggable");
            var proxy = DragObj.proxy;
            var options = DragObj.options;
            if (options.revert) {
                if (checkDrop() == true) {
                    $(e.data.target).css({ position: e.data.startPosition, left: e.data.startLeft, top: e.data.startTop });
                } else {
                    if (proxy) {
                        var left, top;
                        if (proxy.parent()[0] == document.body) {
                            left = e.data.startX - e.data.offsetWidth;
                            top = e.data.startY - e.data.offsetHeight;
                        } else {
                            left = e.data.startLeft;
                            top = e.data.startTop;
                        }
                        proxy.animate({ left: left, top: top }, function () {
                            removeProxy();
                        });
                    } else {
                        $(e.data.target).animate({ left: e.data.startLeft, top: e.data.startTop }, function () {
                            $(e.data.target).css("position", e.data.startPosition);
                        });
                    }
                }
            } else {
                $(e.data.target).css({ position: "absolute", left: e.data.left, top: e.data.top });
                checkDrop();
            }
            options.onStopDrag.call(e.data.target, e);
            $(document).unbind(".draggable");
            setTimeout(function () {
                $("body").css("cursor", "");
            }, 100);
            function removeProxy() {
                if (proxy) {
                    proxy.remove();
                }
                DragObj.proxy = null;
            };
            function checkDrop() {
                var dropped = false;
                DragObj.droppables.each(function () {
                    var dropObj = $(this);
                    if (dropObj.droppable("options").disabled) {
                        return;
                    }
                    var p2 = dropObj.offset();
                    if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()) {
                        if (options.revert) {
                            $(e.data.target).css({ position: e.data.startPosition, left: e.data.startLeft, top: e.data.startTop });
                        }
                        removeProxy();
                        $(this).trigger("_drop", [e.data.target]);
                        dropped = true;
                        this.entered = false;
                        return false;
                    }
                });
                if (!dropped && !options.revert) {
                    removeProxy();
                }
                return dropped;
            };
            return false;
        };
        //实例化插件
        $.fn.draggable = function (options, param) {
            if (typeof options == "string") {
                return $.fn.draggable.methods[options](this, param);
            }
            return this.each(function () {
                var options;
                var target = $.data(this, "draggable");
                if (target) {
                    target.handle.unbind(".draggable");
                    options = $.extend(target.options, options);
                } else {
                    options = $.extend({}, $.fn.draggable.defaults, $.fn.draggable.parseOptions(this), options || {});
                }
                if (options.disabled == true) {
                    $(this).css("cursor", "");
                    return;
                }
                var handle = null;
                if (typeof options.handle == "undefined" || options.handle == null) {
                    handle = $(this);
                } else {
                    handle = (typeof options.handle == "string" ? $(options.handle, this) : options.handle);
                }
                $.data(this, "draggable", { options: options, handle: handle });
                handle.unbind(".draggable").bind("mousemove.draggable", { target: this }, function (e) {
                    if (dragging) {
                        return;
                    }
                    var options = $.data(e.data.target, "draggable").options;
                    if (checkArea(e)) {
                        $(this).css("cursor", options.cursor);
                    } else {
                        $(this).css("cursor", "");
                    }
                }).bind("mouseleave.draggable", { target: this }, function (e) {
                    $(this).css("cursor", "");
                }).bind("mousedown.draggable", { target: this }, function (e) {
                    if (checkArea(e) == false) {
                        return;
                    }
                    $(this).css("cursor", "");
                    var position = $(e.data.target).position();
                    var offset = $(e.data.target).offset();
                    var data = {
                        startPosition: $(e.data.target).css("position"),
                        startLeft: position.left, startTop: position.top,
                        left: position.left,
                        top: position.top,
                        startX: e.pageX,
                        startY: e.pageY,
                        offsetWidth: (e.pageX - offset.left),
                        offsetHeight: (e.pageY - offset.top),
                        target: e.data.target,
                        parent: $(e.data.target).parent()[0]
                    };
                    $.extend(e.data, data);
                    var options = $.data(e.data.target, "draggable").options;
                    if (options.onBeforeDrag.call(e.data.target, e) == false) {
                        return;
                    }
                    $(document).bind("mousedown.draggable", e.data, doDown);
                    $(document).bind("mousemove.draggable", e.data, doMove);
                    $(document).bind("mouseup.draggable", e.data, doUp);
                });
                function checkArea(e) {
                    var dropObj = $.data(e.data.target, "draggable");
                    var handle = dropObj.handle;
                    var offset = $(handle).offset();
                    var left = $(handle).outerWidth();
                    var top = $(handle).outerHeight();
                    var t = e.pageY - offset.top;
                    var r = offset.left + left - e.pageX;
                    var b = offset.top + top - e.pageY;
                    var l = e.pageX - offset.left;
                    return Math.min(t, r, b, l) > dropObj.options.edge;
                };
            });
        };
        //拖动默认的方法
        $.fn.draggable.methods = {
            //返回属性对象
            options: function (jq) {
                return $.data(jq[0], "draggable").options;
            },
            //如果代理属性被设置则返回该拖动代理元素
            proxy: function (jq) {
                return $.data(jq[0], "draggable").proxy;
            },
            //允许拖动
            enable: function (jq) {
                return jq.each(function () {
                    $(this).draggable({ disabled: false });
                });
            },
            //禁止拖动
            disable: function (jq) {
                return jq.each(function () {
                    $(this).draggable({ disabled: true });
                });
            }
        };
        //属性转换器
        $.fn.draggable.parseOptions = function (target) {
            var t = $(target);
            return $.extend({}, $.parser.parseOptions(target, ["cursor", "handle", "axis", { "revert": "boolean", "deltaX": "number", "deltaY": "number", "edge": "number" }]), { disabled: (t.attr("disabled") ? true : undefined) });
        };
        //拖动默认配置--属性 事件
        $.fn.draggable.defaults = {
            proxy: null,//在拖动的时候使用的代理元素,当使用'clone'的时候,将使用该元素的一个复制元素来作为替代元素。如果指定了一个函数,它将返回一个jquery对象
            revert: false,//如果设置为true,在拖动停止时元素将返回起始位置
            cursor: "move",//拖动时的CSS指针样式
            deltaX: null,//被拖动的元素对应于当前光标位置x
            deltaY: null,//被拖动的元素对应于当前光标位置y
            handle: null,//开始拖动的句柄
            disabled: false,//如果设置为true,则停止拖动
            edge: 0,//可以在其中拖动的容器的宽度
            axis: null,//定义元素移动的轴向,可用值有:'v'或'h',当没有设置或设置为null时可同时在水平和垂直方向上拖动
            //在拖动之前触发,返回false将取消拖动
            onBeforeDrag: function (e) {
            },
            //在目标对象开始被拖动时触发
            onStartDrag: function (e) {
            },
            //在拖动过程中触发,当不能再拖动时返回false
            onDrag: function (e) {
            },
            //在拖动停止时触发
            onStopDrag: function (e) {
            }
        };
    })(jQuery);
    View Code

    示例代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Basic Draggable - jQuery EasyUI Demo</title>
        <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
        <link rel="stylesheet" type="text/css" href="../../themes/icon.css">
        <link rel="stylesheet" type="text/css" href="../demo.css">
        <script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
        <script src="../../plugins2/jquery.parser.js"></script>
        <script src="../../plugins2/jquery.draggable.js"></script>
    </head>
    <body>
        <h2>Basic Draggable</h2>
        <div class="demo-info">
            <div class="demo-tip icon-tip"></div>
            <div>Move the boxes below by clicking on it with mouse.</div>
        </div>
        <div style="margin:10px 0;"></div>
        <div class="easyui-draggable" style="200px;height:150px;background:#fafafa;border:1px solid #ccc"></div>
        <div class="easyui-draggable" data-options="handle:'#title'" style="200px;height:150px;background:#fafafa;border:1px solid #ccc;margin-top:10px">
            <div id="title" style="padding:5px;background:#ccc;color:#fff">Title</div>
        </div>
    </body>
    </html>
    View Code

    插件效果

    热爱编程,热爱技术,热爱生活
  • 相关阅读:
    Ibatis,Spring整合(注解方式注入)
    Amoeba搞定mysql主从读写分离
    ClickjackFilterDeny X-Frame-Options
    Clickjacking: X-Frame-Options header missing
    升级至Struts2 2.5.2
    js和java MD5加密
    Struts2 2.5.2
    Struts2 2.5.2的套路
    java8 集合流式操作
    JS 文本输入框放大镜效果
  • 原文地址:https://www.cnblogs.com/DemoLee/p/3500223.html
Copyright © 2020-2023  润新知