:::: 菜单 ::::

getURL或navigateToURL弹出窗口被IE拦截

问题描述:

下午遇到个麻烦: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下拖动会出现花屏——个人经验。
还有一点,无窗口模式消耗资源大,但是能保证帧频

延伸阅读


  1. 其实,我真的很想学我以前的老板,说一句,那些不懂得关闭阻止功能的家伙,不是我们的用户!可惜没有办法,他们很可能是我们的老板或者老板家的亲戚……

  2. Pingback: Flash输入文本内中文乱码 | 『 闪 界 』 Unknow Unknow

  3. Pingback: [转]Flash输入文本在Firefox中文乱码 « balck Unknow Unknow

  4. 不太懂耶,能给重新讲讲吗?谢谢了,我的邮箱:wwwtete@163.com

  5. 跟wmode没有关系,而是跟swf的id有关系,如果插入swf时没有赋id的值(或者值是数字),就有可能被浏览器拦截。

  6. 问题是如果我需要用到透明flash,也就是说必须设置wmode=”transparent”,那么如何防止不被拦截?