参考地址

之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案。不过根据朋友的反馈,reSize的解决方案拖曳的解决方案同时使用时存在效率低下的问题,个人也在进一步使用过程中发现了另外一些问题,共修正以下Bug:

  • 原生panel并无拖曳和缩放功能,且继承panel组件的上层组件太多,极容易出问题,故放弃对panel组件的支持。
  • onResize配合onMove使用时,性能低下,原因是由onResize触发的onMove内部死循环。已修正。
  • resize时,超越浏览器边界会造成缩放和拖动都不可用。通过增加了对offset的监控修正
  • IE8下,reSize超越浏览器边界后依旧会造成缩放和拖曳不可用,原因是IE8此时不影响onkeyup事件。已修正。
  • window,dioalg内部包含layout,datagrid组件时,resize高度小于一定值会造成性能低下。已修正。
  • 初始化时,如果页面不是最大化,onResize会把window和dialog高度自动变小。通过计数器修正。

实现代码:

最终综合两种方案,整理出代码:

  1. var ie = (function() {
  2. var undef, v = 3, div = document.createElement('div'), all = div
  3. .getElementsByTagName('i');
  4. while (div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0]);
  5. return v > 4 ? v : undef;
  6. }());
  7. /**
  8. * add by cgh
  9. * 针对panel window dialog三个组件调整大小时会超出父级元素的修正
  10. * 如果父级元素的overflow属性为hidden,则修复上下左右个方向
  11. * 如果父级元素的overflow属性为非hidden,则只修复上左两个方向
  12. * @param width
  13. * @param height
  14. * @returns
  15. */
  16. var easyuiPanelOnResize = function(width, height) {
  17. if (!$.data(this, 'window') && !$.data(this, 'dialog'))
  18. return;
  19. if (ie === 8) {
  20. var data = $.data(this, "window") || $.data(this, "dialog");
  21. if (data.pmask) {
  22. var masks = data.window.nextAll('.window-proxy-mask');
  23. if (masks.length > 1) {
  24. $(masks[1]).remove();
  25. masks[1] = null;
  26. }
  27. }
  28. }
  29. if ($(this).panel('options').maximized == true) {
  30. $(this).panel('options').fit = false;
  31. }
  32. $(this).panel('options').reSizing = true;
  33. if (!$(this).panel('options').reSizeNum) {
  34. $(this).panel('options').reSizeNum = 1;
  35. } else {
  36. $(this).panel('options').reSizeNum++;
  37. }
  38. var parentObj = $(this).panel('panel').parent();
  39. var left = $(this).panel('panel').position().left;
  40. var top = $(this).panel('panel').position().top;
  41. if ($(this).panel('panel').offset().left < 0) {
  42. $(this).panel('move', {
  43. left : 0
  44. });
  45. }
  46. if ($(this).panel('panel').offset().top < 0) {
  47. $(this).panel('move', {
  48. top : 0
  49. });
  50. }
  51. if (left < 0) {
  52. $(this).panel('move', {
  53. left : 0
  54. }).panel('resize', {
  55. width : width + left
  56. });
  57. }
  58. if (top < 0) {
  59. $(this).panel('move', {
  60. top : 0
  61. }).panel('resize', {
  62. height : height + top
  63. });
  64. }
  65. if (parentObj.css("overflow") == "hidden") {
  66. var inline = $.data(this, "window").options.inline;
  67. if (inline == false) {
  68. parentObj = $(window);
  69. }
  70. if ((width + left > parentObj.width())
  71. && $(this).panel('options').reSizeNum > 1) {
  72. $(this).panel('resize', {
  73. width : parentObj.width() - left
  74. });
  75. }
  76. if ((height + top > parentObj.height())
  77. && $(this).panel('options').reSizeNum > 1) {
  78. $(this).panel('resize', {
  79. height : parentObj.height() - top
  80. });
  81. }
  82. }
  83. $(this).panel('options').reSizing = false;
  84. };
  85. /**
  86. * add by cgh
  87. * 针对panel window dialog三个组件拖动时会超出父级元素的修正
  88. * 如果父级元素的overflow属性为hidden,则修复上下左右个方向
  89. * 如果父级元素的overflow属性为非hidden,则只修复上左两个方向
  90. * @param left
  91. * @param top
  92. * @returns
  93. */
  94. var easyuiPanelOnMove = function(left, top) {
  95. if ($(this).panel('options').reSizing)
  96. return;
  97. var parentObj = $(this).panel('panel').parent();
  98. var width = $(this).panel('options').width;
  99. var height = $(this).panel('options').height;
  100. var right = left + width;
  101. var buttom = top + height;
  102. var parentWidth = parentObj.width();
  103. var parentHeight = parentObj.height();
  104. if (left < 0) {
  105. $(this).panel('move', {
  106. left : 0
  107. });
  108. }
  109. if (top < 0) {
  110. $(this).panel('move', {
  111. top : 0
  112. });
  113. }
  114. if (parentObj.css("overflow") == "hidden") {
  115. var inline = $.data(this, "window").options.inline;
  116. if (inline == false) {
  117. parentObj = $(window);
  118. }
  119. if (left > parentObj.width() - width) {
  120. $(this).panel('move', {
  121. "left" : parentObj.width() - width
  122. });
  123. }
  124. if (top > parentObj.height() - height) {
  125. $(this).panel('move', {
  126. "top" : parentObj.height() - height
  127. });
  128. }
  129. }
  130. };
  131. $.fn.window.defaults.onResize = easyuiPanelOnResize;
  132. $.fn.dialog.defaults.onResize = easyuiPanelOnResize;
  133. $.fn.window.defaults.onMove = easyuiPanelOnMove;
  134. $.fn.dialog.defaults.onMove = easyuiPanelOnMove;

使用的时候,请在引入easyui的核心文件后,直接追加以上代码,注意不要写在document.ready里面。

到这里,panel,window,dialog等组件越界的问题就算是基本解决了。欢迎大家测试,即时反馈Bug。

效果演示:

http://www.easyui.info/easyui/demo/window/062.html

panel,dialog,window组件越界(超出范围)问题汇总的更多相关文章

  1. panel,dialog,window组件越界问题汇总

    之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案.不过根据朋友的反馈,reSize的解决 ...

  2. 解决jqueryeasyUI dialog 弹出窗体超出浏览器,导致不能关闭的bug

    使用panel的onMove事件攻克了panel,dialog以及window组件在被拖动时,会超出浏览器边界而无法拖回的情况. 当窗体被拖出浏览器有边界时.$(document).width();会 ...

  3. jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案

    jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案 2014年8月30日 3233次浏览 相信很多前端朋友都用过jqueryeasyUI,jqueryeasyUI ...

  4. Dialog( 对话框) 组件

    一. 加载方式//class 加载方式<div class="easyui-dialog" title="My Dialog"style="wi ...

  5. 第二百零四节,jQuery EasyUI,Dialog(对话框)组件

    jQuery EasyUI,Dialog(对话框)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解EasyUI中Dialog(窗口)组件的使用方法,这个组件依赖 ...

  6. ExtJS学习之路第八步:Window组件

    一个专门Panel用作程序窗口.默认的,Window可以是浮动的(floated).可缩放(resizable)以及可拖动的(draggable).Window能够被最大化适应可视窗口,(restor ...

  7. EasyUI 关于IE使用window组件上传文件

    有时候IE会对使用window组件上传文件(第二次)不生效,解决方案是: 将该window每次打开的时候,使用: $('#adUploadWindow').window('refresh', 'pan ...

  8. Javascript - ExtJs - Window组件

    1.所有组件都可以放入window,此时子组件不需要配置renderTo,只需要将它们作为window的items子项即可. 2.items子项必须先创建,最后创建window,否则子项不会显示. 3 ...

  9. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

随机推荐

  1. poj 2828 buy Tickets 用线段树模拟带插入的队列

    Buy Tickets Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2 ...

  2. hdu 5207 Greatest Greatest Common Divisor 数学

    Greatest Greatest Common Divisor Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/ ...

  3. HTML下在IE浏览器中的专有条件注释

    在进行WEB标准网页的学习和应用过程中,网页对浏览器的兼容性是经常接触到的一个问题.其中因微软公司的Internet Explorer(简称IE)占据浏览器市场的大半江山,此外还有Firefox.Op ...

  4. 前后端常用通讯方式-- ajax 、websocket

    一.前后端常用通讯方式 1. ajax  浏览器发起请求,服务器返回数据,服务器不能主动返回数据,要实现实时数据交互只能是ajax轮询(让浏览器隔个几秒就发送一次请求,然后更新客户端显示.这种方式实际 ...

  5. Windows Server 2012 R2 两个奇葩问题的解决

    1. 服务管理器一打开就崩溃此问题由Intel HD Graphics显卡驱动不兼容引起,卸载掉驱动,仅使用微软基本显示驱动.等待Intel更新符合WDDM 1.3规范的驱动 2. 不能设置静态IP. ...

  6. Asp.Net Session的三种方法及Web.Config设置

    转载:http://user.gw-ec.com/login/safelog/redirectt?session=so%2f%2bSjyZURMOe54xgk%2bUhL2CgGqDjOKEbYwZS ...

  7. Activex 数字签名

    本次使用makecert的命令如下: makecert -sv online.pvk -n "CN=中国在线" -ss My -r -b 01/01/1900 -e 01/01/9 ...

  8. Openshift 和Harbor的集成

    1.安装配置Harbor 环境rhel 7.6 安装docker,python 安装docker-compose sudo curl -L https://github.com/docker/comp ...

  9. tyvj 2075 借教室 题解

    P2075 [NOIP2012T5]借教室 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 noip2012-tg 描述 在大学期间,经常需要租借教室.大到院 ...

  10. 操作系统概念学习笔记三 cpu调度算法

    一 基本概念 1 队列中的记录通常是进程的进程控制块. 2 CPU调度决策可在如下四种环境下发生 a 当一个进程从运行状态切换到等待状态 例如,I/O请求或调用wait以等待一个子进程的终止 b 党一 ...