getURL或navigateToURL弹出窗口被IE拦截

5次阅读

问题描述:
下午遇到个麻烦:IE7 和 IE8 会拦截 flash 中 navigateToURL(’xxx’,’_blank’);
as2 下的 getURL 一样被拦截。
貌似曾经遇到过这情况,但并不是经常出现,所以一直没去研究被拦截的条件。今天又出现了,正好找找原因。
 
搜索一番,发现很多去年的讨论。
有人指出:
 
IE7 和 Firefox(我使用的版本是 2.0.0.11)会阻止用 navigateToURL 方法打开新窗口,而 AS2 中的 getURL 方法则不会,让人很不爽。既然项目选择了 AS3 开发,就只能想办法来解决。
 
首先当然想到的是 ExternalInterface 了,测试发现还是会被 blocked。后来想添加 wmode 会不会有所帮助,于是在页面中添加 wmode 属性为 opaque,果然 OK 了。
 
现提供 AS3 中的 getURL 方法:
 
function getURL(url:String,window:String=”_blank”):void{var broswer:String=ExternalInterface.call(”function getBrowser(){return navigator.userAgent}”) as String; if(broswer.indexOf(”Firefox”)!=-1 || broswer.indexOf(”MSIE 7.0″)!=-1){ExternalInterface.call(’window.open(”‘+url+’”,”‘+window+’”)’); }else{navigateToURL(new URLRequest(url),window); }}
 
使用方法跟 AS2 中的 getURL 一样。另外,我只测试了 IE6/7,Firefox2,并未对 Safari 等其他浏览器做测试。最后,最最重要的就是在 html 中把 flash 对象设置 wmode 属性为 opaque 或 transparent。因为 wmode 属性默认为 window,这表明此 Flash 应用程序与 HTML 层没有任何交互。
 
上文的思路是用 as call js 来实现弹窗,这需要配合 wmode=’opaque’ 或者 wmode=’transparent’。
 
可是现在时代已经不同,游戏规则又变化了,上文的方法已经不再适用。
我刚测试,
火狐 3.5.3 测试是不会拦截的。
用 IE7 和 IE8 测试都被拦截。
 
真奇怪,有这种事情!于是我把收藏的几个 Flash 酷站整出来一个个看过去,发现其中 apsou 的网站上有_blank 的内容不会被拦截~
调查了其网页的代码,发现和众多会被拦截的网站有一点不同:wmode。
 
解决方案:
终于发现通过设置 wmode 可以解决问题:当 wmode=’window’(默认值)的时候,IE 就不再拦截了。
这也许和 ie 下 activeX 的机制有关吧。
上面引用的文章中提到的 “ 最最重要的就是在 html 中把 flash 对象设置 wmode 属性为 opaque 或 transparent” 这个也不用太担心。wmode 为 window 的时候仍然可以 call js。
 
虽然有解决方法了,可是我又很不情愿把 wmode 改成 window。看来我还得和 js 通信,让 js 那边负责绕过拦截。
 
不过仔细想想其实问题不大,因为我们国内的网友的局势很有趣。
一般用火狐或者 IE7+ 或者 safari、Google Chrome 的都是爱赶潮流的,或者是玩过各种 web2.0 产品的,算是高端一些的网民。这批人都懂得屏蔽是个啥意思,“ 屏蔽弹窗 ” 这样的善意功能也能更好地起作用。这批人往往都会设置白名单,所以并不需要担心他们由于浏览器屏蔽而访问不了内容。
而剩下的大部分使用 XP+ 原装 IE6 的用户,很多并不是对网络很有热情,正好这部分用户的浏览器也不会拦截我们 flash,他们也不用学会网络过滤设置。
嘿嘿,各司其位,自然和谐。
 
几种 wmode 的不同
额,顺便罗列一下 wmode 的几点不同。总结了几种 wmode 有什么不同,各自符合什么情况使用:
Window 是默认的, 窗口模式,吃 CPU 不严重
Transparent 透明无窗口模式
Opaque 不透明无窗口模式
效率最高的是 window 模式
透明用 transparent
而需要动态交互 (比如 js) 或者 window 模式不稳定的情况下用 opaque
Window 和 transparent 在 ie6 的 iframe 下拖动会出现花屏 —— 个人经验。
还有一点,无窗口模式消耗资源大,但是能保证帧频

正文完