window.open 浏览器差异.
首先引入 w3help的,莫的测试: 原帖地址:http://www.w3help.org/zh-cn/causes/BX1053
w3help的测试,和我的测试相互补充,应该比较完整了.悲剧的是我做完测试后,和莫提了一嘴,他告诉我w3help有啊. 我累个去.咋不早说.我可以省不少事呢.
建议先看看w3help的.内容比较详细.尤其是据说 window.open,这种宿主方法.居然,可能在将来被html5所统一.期待啊.
浏览器实现差异:
.一个open的窗口被拦截后, Opera11- ,Chrome11- 仍然会有窗口句柄. 而Safari是undefined ,IE 和 Firefox 则是 null. 而Opera,Chrome拦截掉窗口后.这个窗口的window.closed属性为false.
(所以在不考虑Opera和Chrome的情况下.可以用 !!win 来判断窗口是否被拦截. 而win.closed没有更大的意义)
.sougou高速浏览器2.1+ IE内核下,会无视该弹窗是否为响应用户鼠标操作的回调(a 和 input button 以及button等点击类交互标签是不被拦截的).而一律强制拦截弹窗. 而且用a标签的click()也会被拦截.(好在,IE内核下,被拦截后,win 都是null.可以检测出来,用跳转代替,遗憾的是chromium内核下同chrome一样.被拦截时,无法检测.要检测chrome,opera的弹出,比较麻烦,弹一个about:blank,Opear检测documentElement是否存在,chrome则需要检测documentElement.clientWidth === 0)
.各个浏览器使用window.open,第三参数效果:(应注意,如果连续写多个参数,应以 ","号分隔.如果其中某个参数名有错误,则可能导致整个第三参数在,Chrome和IE浏览器中失效)
浏览器 | 无参数 | width,height | left,top | toolbar | location |
Directories
|
Status
|
Menubar |
Scrollbar
|
Resizable
|
screenX,screenY
|
FullScreen |
期待结果 | 有标签的 标签 无标签的 弹窗 |
尽量按指定 宽高弹窗 |
语义冲突的参数 相对parent页 left ,top位置 |
默认 无工具栏 yes 有工具栏 no 无工具栏 |
默认 有(r) yes 有(w) no 无 (r)只读,(w)可写 |
这玩意到底 是神马? 只有IE6支持 无期待结果 |
默认 无 yes 有 no 无 |
垃圾参数 无视. 只对早期 ie有效 |
默认auto yes auto no 无 |
默认 是 yes 是 no 否 |
真正语义上的参数 相对屏幕坐标 |
全屏显示 |
IE | 6 弹窗 7-8 弹窗 9 标签 |
全部 ok | (注1) | 全部 默认无 yes 有
no 无 |
6 默认 无 yes 有(w) (toolbar也有了) no 无 7,8,9 默认 有(r) yes 有(w) no 有(r) |
6 toolbar去掉 location部分 7,8,9不支持 |
6,7,8 无视参数 始终 有 9 默认 无 yes 有 no 无 |
全部 无视参数 始终 无 |
全部 默认 否 yes 是 no 否 |
不支持 | 全部 支持 |
|
Chrome | 全部 标签 | 全部 ok | 全部相对
父页面
left,top |
不支持此参数 弹窗木有工具栏 |
不支持此参数
始终有,且只读 |
不支持 | 无status bar | 1 无视参数 始终 无 2+ 默认 auto yes auto no auto |
不支持此 参数,一律 可缩放 |
完全 ok | 不支持 | |
FireFox | 1, 1.5 弹窗 2.0+ 标签 |
全部 ok |
全部 |
默认无
yes 有
no 无 |
1, 1.5, 2 默认 无 yes 有(r) no 无 3+ 无视参数 始终有(r) |
不支持
|
无视参数 始终 有 |
无视参数
始终 无
|
2- 默认 否 yes 是 no 否 3+ 不支持此 参数,一律 可缩放. |
完全 ok
|
3.6- 不支持 4 支持 |
|
Safari | 3+ 弹窗 (Safari5 偏好设置 ,在标签中打开新 页面, 选项有-总是 ,永不,自动.默认是 永不.导致此问题.) |
3+ ok |
全部
left 相对父页面 (但当父窗体left的
位置导致新窗体不
能全部显示时,则
新窗体left,相对屏
幕为0,与ie7有些
相似)
top 相对屏幕
|
默认无
yes 有
no 无 |
默认 无 yes 有(w)(但 工具栏也有了) no 无 |
不支持
|
默认 无
yes 有 no 无 |
无视参数
始终 无
|
不支持此
参数,一律 可缩放 |
完全 ok
|
不支持
|
|
Opera | 9.2+ 弹窗 | 9.2 tab 9.6+
标签(有宽高,可拖
拽.但无法离开父
窗口)
|
9.6+
相对父页面
的left,top
9.2 标签
|
9.2 tab 9.6+ 因其本质 是tab所以无视 此参数.一律无 toolbar |
9.2 tab
9.6+ 因其本质
是tab所以无视 此参数.共享 location
|
不支持
|
9.2 tab
9.6+ 因其本质
是tab所以无视 此参数.共享 statusbar
|
无视参数
始终 无
|
不支持此
参数,一律 可缩放 |
不支持
|
不支持
|
|
360安全 | 3.3+ 标签 3.612 弹窗 |
3.612 弹窗(无视 宽高参数parent 页面多大新弹窗 就多大) 其他版本 标签 |
3.612 left top 和parent页面 有关,但位置算 法很混乱. 其他版本 标签
|
3.612 弹窗无视 一切参数.显示 一个完整窗口 其他版本 标签
|
.. | .. | .. | .. | .. | .. | .. | .. |
360高速 | 两种内核都 标签 | IE内核 标签 chromium都 ok |
chromium
同chrome
其他内核 标签
|
..
|
.. | .. | .. | .. | .. | .. | .. | .. |
搜狗高速 | 两种内核都 标签 |
两种内核都 标签
|
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
TT | 标签 | 标签 |
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
QQ5 | 两种内核都 标签 |
两种内核都 标签
|
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
Maxthon2.5 | 标签 |
标签
|
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
Maxthon3 | 两种内核都 标签 | 两种内核都 标签 |
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
世界之窗 | 标签 |
标签
|
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
MyIe | 标签 |
标签
|
标签
|
.. | .. | .. | .. | .. | .. | .. | .. | .. |
ps:表中测试,有冲突的一些项目就不记录详细数据了,地方有限.意义不大.比如 location = no , toolbar=yes 或反之. Safari下 是只有有一个是yes就都会有. 而ie6则很有趣.会分的很细.
第二参数target(name)相关:
用途:
.参考 target =_self , _blank , _top , _parent , target ,还有传说中的_newtab ,神马的.据说可以让ie7+ 不弹窗而是打开新标签.但是我测试失败了.求高人指点.
.为窗口对象设置name属性-window.name.
.所以对于同一个浏览器来说,各个窗口的name是具备唯一性的.(opera9.6+ 开始有些特殊.)
.也就是说, 如果已经存在一个窗口对象的name为abc.则后面再次window.open(url,'acb')的话.那么只会操作这个窗体对象的url,导致跳转或reload(false).无论它是iframe还是一个被open的独立的窗体
差异:
.IE下target(name)的值不能包含如.、& 等特殊字符.否则会报参数错误.(解决办法.避免使用包含特殊字符的字符串,作为name的值)
.IE下name的值为null 或 undefined时,行为与其他浏览器有差异. 等价于 'null' 或 'undefined' .在期望打开多个窗口,又想设置其他窗口参数时,参数设置此2值.会被视为有效的name值. (解决办法,使用 '' 空字符,或'_blank'代替 null 或 undefined. 建议用优先考虑空字符,因为某些浏览器的早期版本不支持 _blank)
.一个已经open的窗口,再次使用相同name,进行window.open操作时,个别浏览器可能不会保证该窗体的可见性(在最上层显示).比如Firefox在最小化某窗口后.(解决办法:可以借助win.focus() 操作强制该窗口在最上层显示.)
.Opera,Chrome 下,如果一个iframe的id,与window.open的第二参数name同名.也具备同样效果. 其他浏览器则无此现象.
.Opera9.6+ ,如果在另一个iframe内调用其self.open的第二参数name与其他iframe的name或id同名,则仍然会重新打开一个窗口. 而不是去操作该iframe.其他浏览器则无此问题
注1
IE6. left 一个奇怪值,top 相对屏幕
IE7. left 相对的位置,总是相对非最大化时,父页的left+10px左右偏移.(就是非最大化时,显示在哪,最大化时,就显示在哪.但并不总是相对非最大化时的父窗口left,比如在父窗口left很靠右的情况下,则其会新窗口会变成相对屏幕来显示)
IE7. left 相对的位置,总是相对非最大化时,父页的left+10px左右偏移.(就是非最大化时,显示在哪,最大化时,就显示在哪.但并不总是相对非最大化时的父窗口left,比如在父窗口left很靠右的情况下,则其会新窗口会变成相对屏幕来显示)
top 相对屏幕
IE8. left,top全部相对屏幕
IE9. left 同IE6类似top 相对屏幕总是0
IE8. left,top全部相对屏幕
IE9. left 同IE6类似top 相对屏幕总是0