浅析利用window.open如何绕过浏览器拦截机制、如何脱离当前浏览器窗口打开新窗口、window.open和window.location.href的区别及常见问题
一、window.open如何绕过浏览器拦截机制
在浏览器的安全机制里,非用户触发的window.open方法是会被拦截的,例如:
var btn = $('#btn');
btn.click(function () {
// 算做用户触发,所以不会被拦截
window.open('http://cssha.com')
});
上面的window.open是用户click触发的,所以不会被拦截,可以正常打开新窗口。再看下面这个:
var btn = $('#btn');
btn.click(function () {
$.ajax({
url: '...',
success: function (url) {
// 会被拦截
window.open(url);
}
})
});
用户没有直接触发window.open,而是发出一个ajax请求,window.open方法被放在了ajax的回调函数里,这样的情况是会被拦截的,因为浏览器认定不是为用户所触发。
那么当用户点击按钮,发出ajax请求,如何在ajax请求完成后再打开新窗口,又不被拦截呢? 接着往下看:
var btn = $('#btn');
btn.click(function () {
// 先打开一个不被拦截的新窗口
var newWindow = window.open();
$.ajax({
url: '...',
success: function (url) {
// 然后修改新窗口的url
newWindow.location.href = url;
}
})
});
当用户点击按钮的时候,先打开一个空白页,这时不会被拦截,然后再发ajax请求,在ajax回调里面修改新窗口的 location.href,这样就不会被拦截了。
二、脱离当前浏览器窗口打开新窗口
1、window.open 语法
window.open(URL,name,features,replace)
其中窗口特征(Features)就不说了,就是用来描述新开的窗口的一些特征的,需要使用的时候去文档查询吧。
2、主要看一下如何脱离当前浏览器窗口打开新窗口
// 在新窗口打开地址 - 在浏览器窗口打开新 tab 页
window.open('http://www.test.url.com','_blank');
// 在新窗口打开地址 - 脱离当前浏览器窗口打开一个新的浏览器窗口
window.open('http://www.test.url.com','_blank','location=no');
三、window.open和window.location.href的区别
1、window.location是你对当前浏览器窗口的URL地址对象的参考,而window.open是用来打开一个新窗口的函数
2、window.open不一定是打开一个新窗口,而有可能替换当前窗口
只要有窗口的名称和window.open中第二个参数中的一样就会将这个窗口替换,用这个特性的话可以在iframe和frame中来代替location.href。
<iframe name="aa"></iframe>
<input type=button οnclick="window.open('1.htm','aa','')">
<input type=button οnclick="self.frames['aa'].location.href='1.htm'">
// 以上 2 种的效果是一样的
3、window.open 用来打开新窗口 - 新窗口打开
而 window.location 用来替换当前页,也就是重新加载当前页 - 当前页打开
4、在框架内指定页面打开连接
window.location或window.open如何指定target? - 这是一个经常遇到的问题,特别是在用 iframe 框架的时。
解决办法:
(1)window.location 改为 top.location 即可在顶部链接到指定页
(2)window.open("你的网址","_top");
5、是否能打开其他网站地址
window.open()是可以在一个网站上打开另外的一个网站的地址,而window.location()是只能在一个网站中打开本网站的网页
6、window.open() 可以经过设置后弹出窗口 - 定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。