六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 99|回复: 0

与<rich:modalPanel />的战斗

[复制链接]

升级  40%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
20
 楼主| 发表于 2013-2-7 22:15:04 | 显示全部楼层 |阅读模式
发自肺腑的说<rich:modalPanel />真是一个不错的弹出层控件
拖动、定位、自动适应大小、手动改变大小 我的需求他都能一一满足

但有些地方也有点人性化过头了 不够灵活
弹出层总是固定(position: fixed)在某个位置上
换句话说 拉动滚动条 弹出层不会跟着上下移动

一般情况下当然没问题 这样也挺好
但当弹出层的高度 > 浏览器的高度后 问题就来了
由于是固定位置 所以超出浏览器的部分就怎么也看不到了
也许控件的作者认为弹出层的内容一定都很短小吧

查看了N遍API 也没发现可以关闭这个"特性"的方法
正规方法的不行 那只能来"硬"的了
过程省略...直接看解决方案吧

IE6以外的浏览器解决方案很简单 只要设置一段CSS样式即可
.rich-mpnl_panel {    position: absolute;}

IE6还不行 需要多费些事
查看源代码得知由于IE6不支持position: fixed
所以弹出层固定位置 是使用IE专有的CSS表达式来实现的
具体代码为 modalPanel.js 580行左右
var leftExpr = "(this.mpLeft || 0) + -Position.cumulativeOffset(this.parentNode)[0] + getSizeElement().scrollLeft + \"px\"";var topExpr = "(this.mpTop || 0) + -Position.cumulativeOffset(this.parentNode)[1] + getSizeElement().scrollTop + \"px\"";eCdiv.style.setExpression("left", leftExpr);eCdiv.style.setExpression("top", topExpr);
由于不想修改控件代码(这样会对以后的升级照成麻烦)
所以只能动态的删除针对top的CSS表达式
代码如下
function removeModalPanelTopFixedForIE6(obj){    //IE6    if(jQuery.browser.msie && jQuery.browser.version < 7)    {        //ID        var id = obj.id.substring(0, obj.id.indexOf("Container"));        //去除针对IE6高度top的css表达式        jQuery(obj).find("#" + id + "CDiv")[0].style.removeExpression("top");    }}
然后需要修正这个问题时这样调用
<rich:modalPanel onshow="removeModalPanelTopFixedForIE6(this)">    ......</rich:modalPanel>
完毕...
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表