ys5955092
(离开布兰卡)
论坛元老
 
UID 95550
精华
0
积分 12355
帖子 558
金钱 12355 喜悦币
威望 0
人脉 0
阅读权限 90
注册 2007-7-17 来自 qd
状态 离线
|
转帖:一个关键字window.status在IE7.0中引起的问题
一个关键字window.status在IE7.0中引起的问题
1
推荐Allen Jiang Email: allenj@hz.webex.com
摘要:从IE6.0升级到IE7.0后,随之带来了许多应用程序的兼容性问题(compatibility) ,相对在IE6.0下的JS随意性,IE.07对W3C标准的支持比IE6.0更严格,虽说目前大多数用户在停留在IE6.0,新旧版本的交替是技术发展的必然,在低版本开发的应用程序能兼容于高版本或者其他类型的Web浏览器相对Web开发至关重要,需引起我们开发人员高度重视。本文提到的问题就涉及到了版本的兼容性。
关键词:IE; 浏览器; Window; status
Tool:Eclipse,.Net 2003 JS、JSP Debug Tool、IE7.0, 6.0
做OMS IE7 Support 过程中,碰到一个很奇怪的问题—IE7.0中在JSP中的有个变量的值无法在页面显示,而在IE6.0中可以正常显示,
一开始怀疑是后台没有把该值设置上,断点调试一下,代码如下:
initData(daname,pagetype){
………
status = 'Printed';
………
}
发现运行status=’Printed’之前status的值为空串,运行该行代码后status的值仍是空串。分析一下,除非该变量属性为read-only,否则理论上是不可能的,这样就只有一种可能就是:status 为global variable, 且已经在程序中被设置了属性为read-only,于是做了一下测试,把status在JS函数中进行声明,成为local variable,这样就可以消除global variable的影响,代码如下:
initData(daname,pagetype){
var status;
………
status = 'Printed';
………
}
测试结果,运行该行代码之前值为undefined,运行该行代码后status的值为"Printed"。结果证明推测是正确的,那么仅仅是因为没有在函数体中对变量做声明问题?但是为什么要设置status全局变量的属性为read-only,于是对该项目JSP、JS搜索,看看是哪里进行了这种诡异的设置,结果没有发现。这会不会是推测出错了,还是有另外的原因?而在调试过程中,我们发现了一个window的变量status,
可以看到,status的值为空串,这和函数体内如果不对status进行局部变量声明的结果一样,狂喜!
我们可以做出如下推测:status 如果不在函数体initData 内声明,缺省是window的成员变量,并且属性为Read-only,但是IE6.0中程序运行却正常,那么只有一种可能—在IE6.0中该成员变量属性为Written。以上只是猜测,笔者做了个测试,结果和预期一样,这基本证明了推测的正确性。笔者又上Microsoft官方网站上一找,找到了如下一段文字:
Status Bar ing--s will no longer be able to set the status bar text through the status and defaultStatus methods by default in the Internet and Restricted Zones. This helps prevent attackers from leveraging those methods to spoof the status bar. To revert to previous behavior and allow s to set the status bar through status and defaultStatus, follow these steps:
1. Open Internet Explorer, click the Tools button, click Internet Options, and then click the Security tab.
2. Click Internet or Restricted sites, and then click the Custom level button.
3. Scroll down to Allow status bar updates via , select Enable.
4. Click OK until you return to Internet Explorer.
上文的意思是为了安全考虑,IE7等版本以后已不允许通过status或defaultStatus直接设置浏览器的状态栏的值,但用户可以通过对浏览器默认设置进行修改而让该值的属性为written,
而不止IE7.0默认不允许用户修改status, Firefox默认也不support该值的属性为written,用户可以通过工具->选项->网页特性->启用java->高级->把修改状态栏文本选上就可以。
以上的测试过程中,细心的人会发现一个问题,就是在IE6.0中我们的应用程序似乎是正常运行,但是却是把status拿来代替为我们自己的变量,可能有人会提出异议,这个我们可以在浏览器的右下角状态栏中得到答案,一旦打开OMS的主页,如果在一个OPPID下有多个orderform,status分别为Printed,Open,Approved,右下角的状态栏在瞬间会完成Printedà Openà Approved显示
而在正常情况下这是不应该发生的,结论就是我们一直在对status进行误操作,考虑到不可能让用户去修改浏览器的默认设置,所以只能在我们代码中修改,Solution就是或者在函数体内对status做声明,或者把该变量名改成其他名称。
值得注意的是:这条规则是Web应用程序只有运行在框架中才能体现出来,如果用单个html对上面的规则做测试,并不能按上述体现。
那么会不会还存在其他特殊的变量也有类似的诡异行为,通过一些官方文档发现,我们开发只要再关注一下另外一个新特性就可以,其他方面只需要了解。
opener and close--Internet Explorer 7 no longer allows the opener trick to bypass the close prompt. Browser windows cannot close themselves unless the windows were created in . This security enhancement no longer allows browsing to a random site when the main browser window closes unexpectedly.
|  心甘情愿做Wzhu的小弟。
|
|