panel,dialog,window组件越界问题汇总
之前分别写过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高度自动变小。通过计数器修正。
实现代码:
最终综合两种方案,整理出代码:
- 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;
使用的时候,请在引入easyui的核心文件后,直接追加以上代码,注意不要写在document.ready里面。
到这里,panel,window,dialog等组件越界的问题就算是基本解决了。欢迎大家测试,即时反馈Bug。
效果演示:
http://www.easyui.info/easyui/demo/window/062.html
panel,dialog,window组件越界问题汇总的更多相关文章
- panel,dialog,window组件越界(超出范围)问题汇总
参考地址 之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案.不过根据朋友的反馈,reSi ...
- Dialog( 对话框) 组件
一. 加载方式//class 加载方式<div class="easyui-dialog" title="My Dialog"style="wi ...
- 第二百零四节,jQuery EasyUI,Dialog(对话框)组件
jQuery EasyUI,Dialog(对话框)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解EasyUI中Dialog(窗口)组件的使用方法,这个组件依赖 ...
- ExtJS学习之路第八步:Window组件
一个专门Panel用作程序窗口.默认的,Window可以是浮动的(floated).可缩放(resizable)以及可拖动的(draggable).Window能够被最大化适应可视窗口,(restor ...
- EasyUI 关于IE使用window组件上传文件
有时候IE会对使用window组件上传文件(第二次)不生效,解决方案是: 将该window每次打开的时候,使用: $('#adUploadWindow').window('refresh', 'pan ...
- Javascript - ExtJs - Window组件
1.所有组件都可以放入window,此时子组件不需要配置renderTo,只需要将它们作为window的items子项即可. 2.items子项必须先创建,最后创建window,否则子项不会显示. 3 ...
- 无废话ExtJs 入门教程三[窗体:Window组件]
无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...
- [转]Office导入导出组件权限配置汇总
原文地址:Office导入导出组件权限配置汇总 具体配置方法如下: 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入 ...
- 实用ExtJS教程100例-008:使用iframe填充ExtJS Window组件
上面两节中我们分别演示了ExtJS Window的常用功能 和 如何最小化ExtJS Window组件,在这篇内容中我们来演示一下如何使用iframe填充window组件. 思路很简单,首先创建一个w ...
随机推荐
- ASP.NET MVC那些事
MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...
- C#学习笔记---修饰符,this关键字和static关键字
1. C#中类的修饰符: public 表示不限制对该类的访问 protected 表示只能从所在类和所在类派生的子类进行访问 private 只有其所在类才能访问 internal 只有对 ...
- JS 正则表达式用法
JS 正则表达式用法简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.其作用如下: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或 ...
- hdu 4024 二分
转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2653003.html 一种是直接根据公式计算的,另外一种是二分算出来的.两种方法速度 ...
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236 Spring获取ApplicationContex ...
- 利用SQLiteOpenHelper来管理SQLite数据库 (转)
转载自 利用SQLiteOpenHelper来管理SQLite数据库 http://blog.csdn.net/conowen/article/details/7306545 Android学习笔记( ...
- 如何重启Cloudera Manager?
为什么重启: 突然发现ClouderaManager的webui访问不了了…… 我使用netstat看了一下我的webui监听端口,发现尼玛N多CLOSE_WAIT,网上查了一下是Socket关闭有问 ...
- JVM的栈内存
每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈.Java栈以帧为单位保存线程的运行状态.虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈. 某个线程正在执行的方法被称为该 ...
- 数据采集器移动手持打印POS终端(PDA)商超抄单方案-PDA抄单无线开单+进销存软件
PDA主要应用在业务员外出在超市能及时抄单发送回总公司,总公司办公人员及时在软件里面调出业务员的抄单数量进行配货,大大提供工作效率. 移动数据终端和无线基础架构相结合,面向零售与批发门店店员的解决方案 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...