zoukankan      html  css  js  c++  java
  • jquery拖拽插件Easydrag

    在一些有弹出框的页面,会经常用到拖拽效果来增加用户体验,避免因弹出框遮挡一些元素。如果用原生的js来写的话,js兼容性很不好控制,经常由于浏览器事件的不统一而影响效果,今天给大家介绍一个拖拽插件easydrag,EasyDrag可以指定可拖动的区域,一个setHandler搞定,不错开源是个好东西,只需要一行代码便可轻松在主流浏览器上

    使用方法示例:

    <!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 runat="server">
    <title>Easydrag</title>
    <script src="js/jquery.min.js"></script>
    <script src="js/jquery.easydrag.js"></script>
    <script >
        $(document).ready ( function(){
            $("#divPanel").easydrag();
            $("#divPanel").setHandler("divTitle");
        });
    </script>
    </head>
    <body>
    <form id="form1" runat="server">
    使用标题进行拖拽
        <div id="divPanel" style="300px;height:300px;background:white;border:1px solid #000000;position:absolute;left:5px;top:50px" >
            <div id="divTitle" style="100%;height:25px;background:lavender">&nbsp;Title</div>
            <div style="100%"></div>
        </div>
    </form>
    </body>
    </html>

    你可以点击这里下载示例

    easydrag源代码:

    /**
    * EasyDrag 1.5 - Drag & Drop jQuery Plug-in
    *
    * Thanks for the community that is helping the improvement
    * of this little piece of code.
    *
    * For usage instructions please visit http://fromvega.com/scripts
    */

    (function($){

    // to track if the mouse button is pressed
    var isMouseDown = false;

    // to track the current element being dragged
    var currentElement = null;

    // callback holders
    var dropCallbacks = {};
    var dragCallbacks = {};

    // bubbling status
    var bubblings = {};

    // global position records
    var lastMouseX;
    var lastMouseY;
    var lastElemTop;
    var lastElemLeft;

    // track element dragStatus
    var dragStatus = {}; 

    // if user is holding any handle or not
    var holdingHandler = false;

    // returns the mouse (cursor) current position
    $.getMousePosition = function(e){
    var posx = 0;
    var posy = 0;

    if (!e) var e = window.event;

    if (e.pageX || e.pageY) {
    posx = e.pageX;
    posy = e.pageY;
    }
    else if (e.clientX || e.clientY) {
    posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }

    return { 'x': posx, 'y': posy };
    };

    // updates the position of the current element being dragged
    $.updatePosition = function(e) {
    var pos = $.getMousePosition(e);

    var spanX = (pos.x - lastMouseX);
    var spanY = (pos.y - lastMouseY);

    $(currentElement).css("top", (lastElemTop + spanY));
    $(currentElement).css("left", (lastElemLeft + spanX));
    };

    // when the mouse is moved while the mouse button is pressed
    $(document).mousemove(function(e){
    if(isMouseDown && dragStatus[currentElement.id] != 'false'){
    // update the position and call the registered function
    $.updatePosition(e);
    if(dragCallbacks[currentElement.id] != undefined){
    dragCallbacks[currentElement.id](e, currentElement);
    }

    return false;
    }
    });

    // when the mouse button is released
    $(document).mouseup(function(e){
    if(isMouseDown && dragStatus[currentElement.id] != 'false'){
    isMouseDown = false;
    if(dropCallbacks[currentElement.id] != undefined){
    dropCallbacks[currentElement.id](e, currentElement);
    }

    return false;
    }
    });

    // register the function to be called while an element is being dragged
    $.fn.ondrag = function(callback){
    return this.each(function(){
    dragCallbacks[this.id] = callback;
    });
    };

    // register the function to be called when an element is dropped
    $.fn.ondrop = function(callback){
    return this.each(function(){
    dropCallbacks[this.id] = callback;
    });
    };

    // disable the dragging feature for the element
    $.fn.dragOff = function(){
    return this.each(function(){
    dragStatus[this.id] = 'off';
    });
    };

    // enable the dragging feature for the element
    $.fn.dragOn = function(){
    return this.each(function(){
    dragStatus[this.id] = 'on';
    });
    };

    // set a child element as a handler
    $.fn.setHandler = function(handlerId){
    return this.each(function(){
    var draggable = this;

    // enable event bubbling so the user can reach the handle
    bubblings[this.id] = true;

    // reset cursor style
    $(draggable).css("cursor", "");

    // set current drag status
    dragStatus[draggable.id] = "handler";

    // change handle cursor type
    $("#"+handlerId).css("cursor", "move"); 

    // bind event handler
    $("#"+handlerId).mousedown(function(e){
    holdingHandler = true;
    $(draggable).trigger('mousedown', e);
    });

    // bind event handler
    $("#"+handlerId).mouseup(function(e){
    holdingHandler = false;
    });
    });
    }

    // set an element as draggable - allowBubbling enables/disables event bubbling
    $.fn.easydrag = function(allowBubbling){

    return this.each(function(){

    // if no id is defined assign a unique one
    if(undefined == this.id || !this.id.length) this.id = "easydrag"+(new Date().getTime());

    // save event bubbling status
    bubblings[this.id] = allowBubbling ? true : false;

    // set dragStatus 
    dragStatus[this.id] = "on";

    // change the mouse pointer
    $(this).css("cursor", "move");

    // when an element receives a mouse press
    $(this).mousedown(function(e){

    // just when "on" or "handler"
    if((dragStatus[this.id] == "off") || (dragStatus[this.id] == "handler" && !holdingHandler))
    return bubblings[this.id];

    // set it as absolute positioned
    $(this).css("position", "absolute");

    // set z-index
    $(this).css("z-index", parseInt( new Date().getTime()/1000 ));

    // update track variables
    isMouseDown = true;
    currentElement = this;

    // retrieve positioning properties
    var pos = $.getMousePosition(e);
    lastMouseX = pos.x;
    lastMouseY = pos.y;

    lastElemTop = this.offsetTop;
    lastElemLeft = this.offsetLeft;

    $.updatePosition(e);

    return bubblings[this.id];
    });
    });
    };

    })(jQuery);

  • 相关阅读:
    【Git】rebase 用法小结(转)
    修饰符访问权限。
    throws与throw关键字。
    多线程,同步代码块。
    多线程,设置线程的优先级。
    多线程,加入线程。
    多线程,守护线程。
    多线程,休眠线程。
    多线程,获取当前线程的对象。
    多线程获取名字和设置名字。
  • 原文地址:https://www.cnblogs.com/aivnfjgj/p/7008782.html
Copyright © 2011-2022 走看看