页:
[1]
| ys5955092 | 2008-2-26 03:38 AM |
|
转帖:一个关键字window.status在IE7.0中引起的问题
一个关键字window.status在IE7.0中引起的问题
1
推荐Allen Jiang Email: [email]allenj@hz.webex.com[/email]
摘要:从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. |
| ys5955092 | 2008-2-26 03:41 AM |
|
| 最近一直在找ie6和ie7中open隐藏状态栏的问题,感觉这篇写的有点意思,给大家分享。 |
| ys5955092 | 2008-2-26 03:41 AM |
|
1、js关闭窗口时老提示的问题。
2、上传图片时无法预览的问题。
3、window.status 无效的问题。
关于第一个,以前在IE6下关闭窗口是这样的,window.opener = null;window.close();在IE7中,这样是不行的,仍然会弹出提示,必须在中间加一句,window.open("","_self"); 像下面的形式就行了。
window.opener = null;
window.open("","_self"); //这是IE7中必需的
window.close();
二、上传图片时的预览
在IE6中可以这样,非常方便。
<input type="file" onchange="Preview(this)"/> <img id="imgPreview" />
<script type="text/javascript">
function Preview(file){
document.getElementById("imgPreview").src = this.value;
}
</script>
但是在IE7中,这样无效,那天我这样测试的时候我用的是 GreenBrowser(绿色浏览器),发现竞然也能预览,但在 MS IE7中就不行,我就纳闷了,我去看了百度相册,他的上传相片预览也是使用这种方式,我是用绿色浏览器看百度相册,用MSIE看我的程序,百度相册上传时能预览,我的程序就是不行.结果我一直在怀疑是不是程序哪里搞错了,上网查了好多资料.硬是没搞定,后来我用MS IE 进百度相册,才发现,原来百度相册也不能预览了.原来是绿色浏览器惹的祸,怪吧,这可是个IE内核的浏览器哦,以后大家记住,测试程序时一定要用微软的IE7,用其它IE内核的浏览器可能会有意想来到的问题.
那在IE7下怎么实现预览呢?答案是:用滤镜,请看下面:
请选择要上传的相片:<input type="file" onchange="Preview(this);" /><br />
<div id="imgPreview" style="filter:progid:DXImageTransform.Microsoft.
AlphaImageLoader(sizingMethod=scale);width:400px;height:200px;"></div>
function Preview(imgFile)
{
document.getElementById("imgPreview").filters.
item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgFile.value;
}
关于AlphaImageLoader滤镜,我顺便也转过来。
语法:
filter: progid: DXImageTransform.Microsoft.AlphaImageLoader( enabled=bEnabled, sizingMethod=sSize, src=sURL)
属性:
enabled : 可选项。布尔值(Boolean)。设置或检索滤镜是否激活。true | false
true : 默认值。滤镜激活。
false : 滤镜被禁止。
sizingMethod : 可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。 crop : 剪切图片以适应对象尺寸。
image : 默认值。增大或减小对象的尺寸边界以适应图片的尺寸。
scale : 缩放图片以适应对象的尺寸边界。PS:自己的体会是,如果padding 和margin的大小不适中的的话,那么背景图片会被撑大。这个缩放还是挺好用的,就相当于那个background-repeat。
src : 必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。
说明:
在对象容器边界内,在对象的背景和内容之间显示一张图片,并提供对此图片的剪切和改变尺寸的操作。如果载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供。
PNG(Portable Network Graphics)格式的图片的透明度不妨碍你选择文本。也就是说,你可以选择显示在PNG(Portable Network Graphics)格式的图片完全透明区域后面的内容。
三、window.status 不显示的问题
在ie6中,使用window.status =" 欢迎光临我的博客!!!",就能在状态栏显示这么一行字,但在IE7中,
本机测试的时候很正常,能显示,但传的服务器上去以后就是不显示,程序运行也没有错误,开始我怀疑是服务器的安全设定问题,后来才发现,又是IE7的问题,IE7的安全性设置中,默认是不能许脚本更新状态栏的。真是可惜了,又少了一块可利用的区域。
如果是自己的电脑的话,可以自己更改设置,使IE7也能显示。
方法是:工具--》Internet 选项--》安全 -- 选中Internet后 点 自定义级别 --》找到“允许状态栏通过脚本更新”,将默认的禁用改为启用就行了。
我特地截了张图。
以上三个虽然是小问题,但如果不明白是浏览器引起的话,很多朋友估计会花很多时间调试程序,但程序是没有问题的。
所以我把它们写在这,希望对大家有所帮助。 |
| ys5955092 | 2008-2-26 03:42 AM |
|
打开无框窗口
<html>
<head>
<script>
function nolo()
{
var tmp=window.open("about:blank","",
"fullscreen=1")
tmp.moveTo(100,100)
tmp.resizeTo(600,400)
tmp.focus()
tmp.location="http://www.163.com"
}
</script>
</head>
<body>
<a href="#" onclick="window.opener=null;window.open('','_self');window.close();"> 不确认关闭 </a>
<hr></hr>
<a href="#" onclick=" javascript:nolo();"> 无框页面 </a>
</body>
</html> |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.018687 second(s), 2 queries |