Prototype1.6以下Element.setStyle()的bug

阅读更多
问题:如果在frame、iframe页面中使用了setStyle()方法后(貌似还不止这个方法有问题),或者使用了script.aculo.us的特效的话,会导致self.name混乱(也就是框架本身的名字),这样的话用链接元素的target指定到这个框架就没效果了,浏览器将按默认行为在新窗口中打开!

解决办法:

1、升级Prototype和Script.aculo.us到最新版本(1.6、1.8),经测试已无bug。

2、自己打补丁,很容易,但比较麻烦,总的思想就是,在做了可能引起bug的操作后,自行恢复iframe的self.name。

    首先,不使用setStyle()方法改变元素样式,转而用传统的element.style.xx;

    然后,在用到script.aculo.us特效的地方,设置其结束的回调函数,比如afterFinish,在其中做恢复self.name操作。当然,这 个方法不是无懈可击的,因为在特效运行的过程中,还是存在问题,所以说升级版本才是王道,1.6版做了很大的改进,可以说将会改变之前写 javascript代码习惯,我个人是非常期待的。
 

附上一个简单的恢复窗体名称的办法:

js 代码
 
  1. //先保存一下当前窗体名称  
  2. var frame_name = self.name;     
  3.   
  4. //如果发现变化了,就恢复回去  
  5. function fixTarget(){  
  6.     if(self.name != frame_name) { self.name = frame_name; }  
  7. }  

 

页面一加载就执行这段代码,以后便可通过fixTarget函数来恢复了。有个找抽的办法,你可以起一个定时器,定时执行这个函数,如果间隔短点的话,效果应该也还不错,当然,你付出的代价就是客户的内存......

你可能感兴趣的:(框架,JavaScript,CSS,prototype,浏览器)