代码改变世界

可怕的Jquery

2008-05-29 13:30  废墟中的垃圾  阅读(2129)  评论(2)    收藏  举报

一直有一些很棘手的问题,就是跨浏览器的某些高度问题。

普通的高度style.height就可以获得,而且所有浏览器都支持。但是一些特殊效果的高度就不是那么简单了。

js 获得当前高度有特别多的参数,什么offset,client阿之类的。但是在jquery里面,想获得当前浏览窗口的宽度和高度一句话搞定

$(window).heigth();

$(window).width();

大家会说这个效果有啥子用?其实平时常见到的那种背景把所有浏览器挡住,然后弹出一个对话框或者交互框,都需要这个。那么上面两句话就很容易的帮了大家的忙。

Jquery的可怕展示出来,兼容性做的如此之好,而且当初居然我没有用这个,用的别的方法,当然也解决了问题,不过那时相当的麻烦。

但是有没有人用过在框架内页里面去展示一个全屏的这样的背景呢(因为frameset完全被和谐化,所以这里说的是iframe)?Jqeury的可怕再次展示出来,这次不是说他的利害,而且他的美中不足。

在jquery的官方文档中说,dom模型的对象,如果被浏览器支持,那么就会被jqeury支持。那么正常来讲,想获得父窗体就是$(window.parent) 获得父窗体文档就是$(window.parent.document),但是这样处理以后,发现两个对象的属性都和正常的不一样。完全出不来效果,而且会抱错。Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame ::

好可怕的,居然网上搜索半天,没有任何解决方案。获得以后的对象只有innerWidth,innerHeight,outerWidth,outerHeight,而这些属性,完全不是想要的结果。(这里要说明$(window.parent.document)是可以获得对象的,而且可以用find定位子元素,同时可以进行相应的控制)。

通过一夜的艰苦卓绝的努力,问题终于搞定。(这里我希望有更好的解决方案,我始终不认为Jquery这么可怕到,这点东西都支持不了。)

就在我为解决了问题而高兴的时候,又出现了一个新的bug,当我第一次获得父曾$(window).height()的时候没有问题,但是我这样写

$(window).heigth();

$(window).width();

当我第二次调用这个的时候 $(window).heigth(); 死活比正常的爱了 16像素。可怕的16像素,这个像素正好是一个margin的宽度。但是始终找不出来问题。这里希望大家可以给谢意见,先谢谢了。

现在开始说解决问题的基本思路,在父层加入两个隐藏的元素(任意元素)$(window).heigth() 和$(window).width();在document的ready事件里面为这些元素赋值。

同时需要把弹出层的代码放在父层文档里面。这样在子层文档里面通过$(window.parent.document),find("可以选择到弹出层的表达式")然后设置宽度和高度为父层刚才的隐藏的元素。这样就可以搞定了。

这里也只是给点思路,具体代码就不拿出来,因为耦合性比较大,剥出来需要时间比较长,希望大家见谅。

这里希望得到更好的解决方案,希望大家帮忙。