1. 程式人生 > >easyui window拖動越界2中解決方案

easyui window拖動越界2中解決方案

1.使用easyui.min.js檔案呼叫easyui控制元件,只需要引用如下檔案即可:

	/*----------------------------------------------------------------
            // 檔名:window-dragbug-fix.js
            // 檔案功能描述:修復easyui中panel,dialog,window元件拖拽越界問題
            //
            // 
            // 建立標識:dudw 20141226
            //
            // 修改標識:
            // 修改描述:
            //
            // 修改標識:
            // 修改描述:
			//----------------------------------------------------------------*/


	var ie = (function() {   
	    var undef, v = 3, div = document.createElement('div'), all = div   
	            .getElementsByTagName('i');   
	    while (div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0]);   
	    return v > 4 ? v : undef;   
	}());   
	/**
	 * add by cgh  
	 * 針對panel window dialog三個元件調整大小時會超出父級元素的修正  
	 * 如果父級元素的overflow屬性為hidden,則修復上下左右個方向  
	 * 如果父級元素的overflow屬性為非hidden,則只修復上左兩個方向  
	 * @param width  
	 * @param height  
	 * @returns  
	 */  
	var easyuiPanelOnResize = function(width, height) {   
	    if (!$.data(this, 'window') && !$.data(this, 'dialog'))   
	        return;   
	  
	    if (ie === 8) {   
	        var data = $.data(this, "window") || $.data(this, "dialog");   
	        if (data.pmask) {   
	            var masks = data.window.nextAll('.window-proxy-mask');   
	            if (masks.length > 1) {   
	                $(masks[1]).remove();   
	                masks[1] = null;   
	            }   
	        }   
	    }   
	    if ($(this).panel('options').maximized == true) {   
	        $(this).panel('options').fit = false;   
	    }   
	    $(this).panel('options').reSizing = true;   
	    if (!$(this).panel('options').reSizeNum) {   
	        $(this).panel('options').reSizeNum = 1;   
	    } else {   
	        $(this).panel('options').reSizeNum++;   
	    }   
	    var parentObj = $(this).panel('panel').parent();   
	    var left = $(this).panel('panel').position().left;   
	    var top = $(this).panel('panel').position().top;   
	  
	    if ($(this).panel('panel').offset().left < 0) {   
	        $(this).panel('move', {   
	                    left : 0   
	                });   
	    }   
	    if ($(this).panel('panel').offset().top < 0) {   
	        $(this).panel('move', {   
	                    top : 0   
	                });   
	    }   
	  
	    if (left < 0) {   
	        $(this).panel('move', {   
	                    left : 0   
	                }).panel('resize', {   
	                    width : width + left   
	                });   
	    }   
	    if (top < 0) {   
	        $(this).panel('move', {   
	                    top : 0   
	                }).panel('resize', {   
	                    height : height + top   
	                });   
	    }   
	    if (parentObj.css("overflow") == "hidden") {   
	        var inline = $.data(this, "window").options.inline;   
	        if (inline == false) {   
	            parentObj = $(window);   
	        }   
	  
	        if ((width + left > parentObj.width())   
	                && $(this).panel('options').reSizeNum > 1) {   
	            $(this).panel('resize', {   
	                        width : parentObj.width() - left   
	                    });   
	        }   
	  
	        if ((height + top > parentObj.height())   
	                && $(this).panel('options').reSizeNum > 1) {   
	            $(this).panel('resize', {   
	                        height : parentObj.height() - top   
	                    });   
	        }   
	    }   
	    $(this).panel('options').reSizing = false;   
	};   
	/**
	 * add by cgh  
	 * 針對panel window dialog三個元件拖動時會超出父級元素的修正  
	 * 如果父級元素的overflow屬性為hidden,則修復上下左右個方向  
	 * 如果父級元素的overflow屬性為非hidden,則只修復上左兩個方向  
	 * @param left  
	 * @param top  
	 * @returns  
	 */  
	var easyuiPanelOnMove = function(left, top) {   
	    if ($(this).panel('options').reSizing)   
	        return;   
	    var parentObj = $(this).panel('panel').parent();   
	    var width = $(this).panel('options').width;   
	    var height = $(this).panel('options').height;   
	    var right = left + width;   
	    var buttom = top + height;   
	    var parentWidth = parentObj.width();   
	    var parentHeight = parentObj.height();   
	  
	    if (left < 0) {   
	        $(this).panel('move', {   
	                    left : 0   
	                });   
	    }   
	    if (top < 0) {   
	        $(this).panel('move', {   
	                    top : 0   
	                });   
	    }   
	  
	    if (parentObj.css("overflow") == "hidden") {   
	        var inline = $.data(this, "window").options.inline;   
	        if (inline == false) {   
	            parentObj = $(window);   
	        }   
	        if (left > parentObj.width() - width) {   
	            $(this).panel('move', {   
	                        "left" : parentObj.width() - width   
	                    });   
	        }   
	        if (top > parentObj.height() - height) {   
	            $(this).panel('move', {   
	                        "top" : parentObj.height() - height   
	                    });   
	        }   
	    }   
	};   
	  
	$.fn.window.defaults.onResize = easyuiPanelOnResize;   
	$.fn.dialog.defaults.onResize = easyuiPanelOnResize;   
	$.fn.window.defaults.onMove = easyuiPanelOnMove;   
	$.fn.dialog.defaults.onMove = easyuiPanelOnMove;  

2.若是使用的easyloader.js檔案呼叫控制元件

   只需要改三處,我用//                //區分出來了!

/**
 * jQuery EasyUI 1.4
 * 
 * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
 *
 * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
 * To use it on other terms please contact us at [email protected]
 *
 */
(function($) {
	//---------------------------
	function dragCheck(e,targetPos,type){
		//工作列的位置
		/**
		 * 工作列值
		 *   0表示工作列在左側
		 *   1表示工作列在下側
		 *   2表示工作列在右側
		 */
 		var taskBarPos = $("#taskBar").data("taskBarPos");
 		
	    if(1 == taskBarPos) {
	    	wW=document.documentElement.clientWidth;
	    	wH=document.documentElement.clientHeight - $("#task_lb_wrap").height(); //減去工作列的高度
	    } else {
	    	wW=document.documentElement.clientWidth - $("#task_lb_wrap").width();
	    	wH=document.documentElement.clientHeight;
	    }
	    tW=$(e.data.target).width();//target width  目標物件的寬度
	    var left=$(e.data.left)[0]; //目標物件想做偏移量 left
	    
	    tH=$(e.data.target).height();//target height 目標物件的高度  
	    targetPos=$(e.data.target).position();
	    var top = $(e.data.top)[0]; //目標物件想做偏移量 top
	    
	    if(type=="drop"){
	      //console.log("螢幕的寬度:" + wW);
	      //console.log("螢幕的高度:" + wH);
	      eL=eT="";  
	      if(left+tW > wW - 20){
	    	  //如果window拖到了最右邊
	    	  eL = wW-tW-10;
	      }
	      if(top<=0.1){
	    	  //如果window拖到了最上面
	          eT = 0.1;
	      }
	      if(left<=0.1) {
	    	  //如果window拖到了最左邊
	    	  eL = 0.1;
	      }
	      if(top+tH > wH - 20) {
	    	  //如果window拖到最下邊
	    	  eT = wH - tH - 10;
	      }
	      return {eL:eL,eT:eT};
	      /**
	       * eL:0.1  靠近最左邊
	       * eT:0.1  靠近最上面
	       * 
	       * eL:wW-tW 靠近最右邊
	       * eT:-(wH-tH) 靠近最下邊 330?
	       */
	    }
	     
	    if(targetPos.left>wW-tW-20){
	       targetPos.left=wW-tW-20;
	    }
	}
	//-------------------------------
    function _1(e) {
        var _2 = $.data(e.data.target, "draggable");
        var _3 = _2.options;
        var _4 = _2.proxy;
        var _5 = e.data;
        var _6 = _5.startLeft + e.pageX - _5.startX;
        var _7 = _5.startTop + e.pageY - _5.startY;
        if (_4) {
            if (_4.parent()[0] == document.body) {
                if (_3.deltaX != null && _3.deltaX != undefined) {
                    _6 = e.pageX + _3.deltaX;
                } else {
                    _6 = e.pageX - e.data.offsetWidth;
                }
                if (_3.deltaY != null && _3.deltaY != undefined) {
                    _7 = e.pageY + _3.deltaY;
                } else {
                    _7 = e.pageY - e.data.offsetHeight;
                }
            } else {
                if (_3.deltaX != null && _3.deltaX != undefined) {
                    _6 += e.data.offsetWidth + _3.deltaX;
                }
                if (_3.deltaY != null && _3.deltaY != undefined) {
                    _7 += e.data.offsetHeight + _3.deltaY;
                }
            }
        }
        if (e.data.parent != document.body) {
            _6 += $(e.data.parent).scrollLeft();
            _7 += $(e.data.parent).scrollTop();
        }
        if (_3.axis == "h") {
            _5.left = _6;
        } else {
            if (_3.axis == "v") {
                _5.top = _7;
            } else {
                _5.left = _6;
                _5.top = _7;
            }
        }
    };
    function _8(e) {
        var _9 = $.data(e.data.target, "draggable");
        var _a = _9.options;
        var _b = _9.proxy;
        if (!_b) {
            _b = $(e.data.target);
        }
        _b.css({
            left: e.data.left,
            top: e.data.top
        });
        $("body").css("cursor", _a.cursor);
    };
    function _c(e) {
        $.fn.draggable.isDragging = true;
        var _d = $.data(e.data.target, "draggable");
        var _e = _d.options;
        var _f = $(".droppable").filter(function() {
            return e.data.target != this;
        }).filter(function() {
            var _10 = $.data(this, "droppable").options.accept;
            if (_10) {
                return $(_10).filter(function() {
                    return this == e.data.target;
                }).length > 0;
            } else {
                return true;
            }
        });
        _d.droppables = _f;
        var _11 = _d.proxy;
        if (!_11) {
            if (_e.proxy) {
                if (_e.proxy == "clone") {
                    _11 = $(e.data.target).clone().insertAfter(e.data.target);
                } else {
                    _11 = _e.proxy.call(e.data.target, e.data.target);
                }
                _d.proxy = _11;
            } else {
                _11 = $(e.data.target);
            }
        }
        _11.css("position", "absolute");
        _1(e);
        _8(e);
        _e.onStartDrag.call(e.data.target, e);
        return false;
    };
    function _12(e) {
        var _13 = $.data(e.data.target, "draggable");
        _1(e);
        if (_13.options.onDrag.call(e.data.target, e) != false) {
            _8(e);
        }
        var _14 = e.data.target;
        _13.droppables.each(function() {
            var _15 = $(this);
            if (_15.droppable("options").disabled) {
                return;
            }
            var p2 = _15.offset();
            if (e.pageX > p2.left && e.pageX < p2.left + _15.outerWidth() && e.pageY > p2.top && e.pageY < p2.top + _15.outerHeight()) {
                if (!this.entered) {
                    $(this).trigger("_dragenter", [_14]);
                    this.entered = true;
                }
                $(this).trigger("_dragover", [_14]);
            } else {
                if (this.entered) {
                    $(this).trigger("_dragleave", [_14]);
                    this.entered = false;
                }
            }
        });
        return false;
    };
    function _16(e) {
        $.fn.draggable.isDragging = false;
        _12(e);
        var _17 = $.data(e.data.target, "draggable");
        var _18 = _17.proxy;
        var _19 = _17.options;
        if (_19.revert) {
            if (_1a() == true) {
                $(e.data.target).css({
                    position: e.data.startPosition,
                    left: e.data.startLeft,
                    top: e.data.startTop
                });
            } else {
                if (_18) {
                    var _1b, top;
                    if (_18.parent()[0] == document.body) {
                        _1b = e.data.startX - e.data.offsetWidth;
                        top = e.data.startY - e.data.offsetHeight;
                    } else {
                        _1b = e.data.startLeft;
                        top = e.data.startTop;
                    }
                    _18.animate({
                        left: _1b,
                        top: top
                    },
                    function() {
                        _1c();
                    });
                } else {
                    $(e.data.target).animate({
                        left: e.data.startLeft,
                        top: e.data.startTop
                    },
                    function() {
                        $(e.data.target).css("position", e.data.startPosition);
                    });
                }
            }
        } else {
    		//---------------------
				var _pos=$(e.data.target);
				var returnVar=dragCheck(e,$(e.data.target),"drop");
				if(returnVar!=undefined){
				 
				   if(returnVar.eL!=""){
				     e.data.left=returnVar.eL;
				   }
				   if(returnVar.eT!=""){
				     e.data.top=returnVar.eT;
				   } 
				}
			//---------------------
            $(e.data.target).css({
                position: "absolute",
                left: e.data.left,
                top: e.data.top
            });
            _1a();
        }
        _19.onStopDrag.call(e.data.target, e);
        $(document).unbind(".draggable");
        setTimeout(function() {
            $("body").css("cursor", "");
        },
        100);
        function _1c() {
            if (_18) {
                _18.remove();
            }
            _17.proxy = null;
        };
        function _1a() {
            var _1d = false;
            _17.droppables.each(function() {
                var _1e = $(this);
                if (_1e.droppable("options").disabled) {
                    return;
                }
                var p2 = _1e.offset();
                if (e.pageX > p2.left && e.pageX < p2.left + _1e.outerWidth() && e.pageY > p2.top && e.pageY < p2.top + _1e.outerHeight()) {
                    if (_19.revert) {
                        $(e.data.target).css({
                            position: e.data.startPosition,
                            left: e.data.startLeft,
                            top: e.data.startTop
                        });
                    }
                    $(this).trigger("_drop", [e.data.target]);
                    _1c();
                    _1d = true;
                    this.entered = false;
                    return false;
                }
            });
            if (!_1d && !_19.revert) {
                _1c();
            }
            return _1d;
        };
        return false;
    };
    $.fn.draggable = function(_1f, _20) {
        if (typeof _1f == "string") {
            return $.fn.draggable.methods[_1f](this, _20);
        }
        return this.each(function() {
            var _21;
            var _22 = $.data(this, "draggable");
            if (_22) {
                _22.handle.unbind(".draggable");
                _21 = $.extend(_22.options, _1f);
            } else {
                _21 = $.extend({},
                $.fn.draggable.defaults, $.fn.draggable.parseOptions(this), _1f || {});
            }
            var _23 = _21.handle ? (typeof _21.handle == "string" ? $(_21.handle, this) : _21.handle) : $(this);
            $.data(this, "draggable", {
                options: _21,
                handle: _23
            });
            if (_21.disabled) {
                $(this).css("cursor", "");
                return;
            }
            _23.unbind(".draggable").bind("mousemove.draggable", {
                target: this
            },
            function(e) {
                if ($.fn.draggable.isDragging) {
                    return;
                }
                var _24 = $.data(e.data.target, "draggable").options;
                if (_25(e)) {
                    $(this).css("cursor", _24.cursor);
                } else {
                    $(this).css("cursor", "");
                }
            }).bind("mouseleave.draggable", {
                target: this
            },
            function(e) {
                $(this).css("cursor", "");
            }).bind("mousedown.draggable", {
                target: this
            },
            function(e) {
                if (_25(e) == false) {
                    return;
                }
                $(this).css("cursor", "");
                var _26 = $(e.data.target).position();
				//--------
			    dragCheck(e,_26);
			    //--------
                var _27 = $(e.data.target).offset();
                var _28 = {
                    startPosition: $(e.data.target).css("position"),
                    startLeft: _26.left,
                    startTop: _26.top,
                    left: _26.left,
                    top: _26.top,
                    startX: e.pageX,
                    startY: e.pageY,
                    offsetWidth: (e.pageX - _27.left),
                    offsetHeight: (e.pageY - _27.top),
                    target: e.data.target,
                    parent: $(e.data.target).parent()[0]
                };
                $.extend(e.data, _28);
                var _29 = $.data(e.data.target, "draggable").options;
                if (_29.onBeforeDrag.call(e.data.target, e) == false) {
                    return;
                }
                $(document).bind("mousedown.draggable", e.data, _c);
                $(document).bind("mousemove.draggable", e.data, _12);
                $(document).bind("mouseup.draggable", e.data, _16);
            });
            function _25(e) {
                var _2a = $.data(e.data.target, "draggable");
                var _2b = _2a.handle;
                var _2c = $(_2b).offset();
                var _2d = $(_2b).outerWidth();
                var _2e = $(_2b).outerHeight();
                var t = e.pageY - _2c.top;
                var r = _2c.left + _2d - e.pageX;
                var b = _2c.top + _2e - e.pageY;
                var l = e.pageX - _2c.left;
                return Math.min(t, r, b, l) > _2a.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(_2f) {
        var t = $(_2f);
        return $.extend({},
        $.parser.parseOptions(_2f, ["cursor", "handle", "axis", {
            "revert": "boolean",
            "deltaX": "number",
            "deltaY": "number",
            "edge": "number"
        }]), {
            disabled: (t.attr("disabled") ? true: undefined)
        });
    };
    $.fn.draggable.defaults = {
        proxy: null,
        revert: false,
        cursor: "move",
        deltaX: null,
        deltaY: null,
        handle: null,
        disabled: false,
        edge: 0,
        axis: null,
        onBeforeDrag: function(e) {},
        onStartDrag: function(e) {},
        onDrag: function(e) {},
        onStopDrag: function(e) {}
    };
    $.fn.draggable.isDragging = false;
})(jQuery);


相關推薦

easyui window越界2解決方案

1.使用easyui.min.js檔案呼叫easyui控制元件,只需要引用如下檔案即可: /*---------------------------------------------------------------- // 檔名:window

jQuery EasyUI window超出瀏覽器邊界問題修正

easyui-window擴充套件自 $.fn.panel.defaults,用 $.fn.window.defaults 重寫了 defaults。 實際使用的時候,視窗可能會被拖拽到瀏覽器視窗以外的位置,文章在初始化window對視窗的位置進行限制,當拖拽視窗位置超

easyUI

<script type="text/javascript"> $.extend($.fn.datagrid.methods, { columnMoving: function(jq) { return jq.each(function() { var targ

Win10不能直接檔案開啟的解決辦法

Win10不能直接拖動檔案開啟的解決辦法 大多數人安裝好win10 後,很多軟體的拖拽檔案拖到軟體上直接開啟的功能失效,這時必須要用軟體裡的開啟功能,這是非常麻煩的。經過測試有兩種方法可以解決。 方法1 按Windows鍵+R,開啟“執行”對話方塊:輸入regedit,回車或確

ajax非同步請求使用window.open會被瀏覽器攔截解決方案

問題剖析:function click_fun(){ window.open("www.baidu.com");//能開啟 $.ajax({ 'url': '${pageContext.request.contextPath}/activity/sav

QML滑鼠移動ListView項的位置

在QML開發中,ListView是我們經常用到的控制元件,可以用它給使用者展示出列表,但是往往都是將專案的顯示順序排好後,直接讓ListView顯示出來,亦或者是知道要移動到具體的那一位置,然後調整資料在ListView中的順序來達到要求,現有一種需求,就是用滑鼠拖動某項,

安卓開發 RecycleView notifyItemRemoved遇到的那些坑, IndexOutOfIndexException、刪除錯亂,陣列越界等終極解決方案,多人親測可行

當我們在開發過程中要刪除RecycleView中的某個item時,都喜歡notifyItemRemoved方法帶來的動畫效果,然而,會遇到錯亂的坑,主要有三個,如下: 再刪除後面的item,會發生錯

window.open被瀏覽器攔截的解決方案

方案 attr fun click open target win element blog function newWin(url, id) { var a = document.createElement(‘a‘);

WebKit.NET-0.5簡單應用(2)——音量解決方案

word entry imp ssi rsh turn ati window bject 查找WebKit.NET相關文檔,沒有找到音量控制解決方法。換思路進行解決,嘗試用Win32 API進行解決 [DllImport("winmm.dll")] public stat

redis requires ruby version 2.2.2解決方案

命令 configure .net rap pan -h tro ext download 原文:redis requires ruby version 2.2.2的解決方案 今天在做Redis的Cluster集群的時候,在執行gem install redis時,提示

mysql報錯碼code=exited,status=2解決方案

b- 官方 重啟失敗 ORC ng- 重啟 inno 死機 失敗 由於電腦死機,導致MySQL無法重啟。 解決方案看官方文檔,設置完後重啟失敗,再把innodb_force_recovery = 1去掉就可以了 https://dev.mysql.com/doc/refma

挖礦病毒 qW3xT.2 最終解決方案

rop mod detail ios tail index $2 ashx hoc 轉自:https://blog.csdn.net/hgx13467479678/article/details/82347473 1,cpu 100%, 用top 查看cpu100

Maven打包時報Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war解決方案

問題現象: 用Maven打包時,報Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war錯誤。   原因分析: 打包時在WebContent/WEB-INF/資料夾下找不到web.xml檔案。 &nb

Failed to resolve: com.android.support:support-annotations:26.0.2解決方案

在新增依賴的時候,出現如下報錯: 說我缺少了support-annotations:26.0.2的依賴,那麼問題來了,什麼是support-annotations?我的專案裡面用到了嗎? support-annotations註解庫簡介 android-support-anno

理解以太坊的Layer 2擴容解決方案:狀態通道(State Channels)、Plasma 和 Truebit

-賓夕法尼亞州的尼科爾森大橋建設照片(圖源)。羅馬人的工程原理擴充套件至新的應用 對於以太坊來說,2018年是專注底層架構之年。今年很多早期參與者會測試網路極限,並且重新關注以太坊的擴容技術。 以太坊仍然處於起步階段。直到現在,它仍然沒有那麼安全或者可擴充套件。對於任何密切關注以太坊技術的人來說,這都是很

Android RecycleView拽超過一屏發生閃屏無法拽的bug的解決方案

公司新的需求中需要使用拖拽排序的功能,使用RecycleView加上ItemTouchHelper來實現。實現比較簡單,但是出現了拖拽超過一屏發生閃動,並自動結束了自動排序的問題,以下是功能實現,解決方案在文章最後加粗顯示。 1.初始化RecyclerView,併為Recy

EMA/EHA 作器控制研究解決方案

概述 隨著未來飛機向高機動性、超高音速及大功率方向的發展,要求機載作動系統具有更高的效能,傳統機載系統中快速響應與高效率之間的矛盾更加突出。同時,飛控系統正在向功率電傳方向發展。隨著電動機技術、材料技術、控制學和精密製造學等的發展,電作動系統得到了極大的發展,未來將成為主要的機載作動系統。

區分VS解決方案(solution)和工程(project)

        在visual studio中,新建一個工程時會發現如下圖的介面: 其中“名稱”代表的是專案(project)的名字,“解決方案名稱”即solution;在“解決方案”這一欄裡可以選擇

關於Android4.x系統支援TLS1.2解決方案

為Http請求的網路客戶端設定一個特殊的SSLSocketFactory。 這個代理SSLSocketFactory在建立一個Socket連線的時候,會設定Socket的可用的TLS版本。 private static final String[] TLS_

Apache之——命令列啟動出現Failed to open the Apache2.2 Service解決方案

Apache命令列啟動[關閉|重啟]的命令是:httpd -k start[stop|restart] 出現Failed to open the Apache2.2 Service。其實是許可權問題,可以通過以下方法解決: 開啟執行 找到cmd ,右鍵開啟cmd.exe