我正在参加「掘金·启航计划」
情况
在一个项目中唤醒另一个项目 window.open(url) url为另外独特的一种数据链接,被浏览器拦截了,需要用户自己手动允许才可以访问
window.open("IbmClint//:-i 137.23.43.11 -p 445 -u admin -w password")
原因
检索后了解:某些浏览器(比如Chrome)出于安全和体验的考虑,会禁止直接在JS中使用 window.open(url) 打开新的窗口。但是如果使用 window.open(url,'_self') 改变当前窗口是允许的。
禁止直接打开的原因就是非用户操作产生的新弹出窗口,会被认为这可能是一个广告,所以禁止了这种行为。但是在开发的时候, 有时候又的确存在需要使用的场景。从浏览器客户端来看,可以在浏览器客户端设置, 但是这种方式只能临时或单个机器解决。
//所有浏览器都不会拦截。
document.body.addEventListener(‘click‘, function() {
window.open(‘//www.baidu.com‘, ‘_blank‘);
});
综上所述,各浏览器对拦截时机的判断不一致,而对于放在ajax回调中的代码,
反应又不相同了,这里就不再赘述。但是,被浏览器拦截我们代码中要弹出的窗口并不是程序员所希望的。
解决方案:
1、a标签的点击事件
给出如下函数,将此函数绑定到click的事件回调中,就可以避免大部分浏览器(不是所有)对窗口弹出的拦截:
function newWin(url, id) {
var a = document.createElement(‘a‘);
a.setAttribute(‘href‘, url);
a.setAttribute(‘target‘, ‘_blank‘);
a.setAttribute(‘id‘, id);
// 防止反复添加
if(!document.getElementById(id)) {
document.body.appendChild(a);
}
a.click();
}
2、使用form的submit方法打开一个页面
var form = document.createElement('form');
form.action = 'www.baidu.com?id=1';
form.target = '_blank'; form.method = 'POST';
document.body.appendChild(form);
form.submit();
3、延迟这个打开操作
setTimeout('window.open(url);', 500); // 延迟时间不能太短 否则也会被拦截
4、通过JS打开新窗口会被拦截,换一种实现方式
var tempwindow=window.open('_blank'); // 先打开页面
tempwindow.location='http://www.baidu.com'; // 后更改页面地址
5、终极解决方案 ----iframe
openlient(admin, password) {
var t = document.createElement("iframe");
t.style.display = "none";
t.src = `ICCClient:// -i 155.66.32.102 -p 443 -u ${admin} -w ${password} -a`;
document.body.appendChild(t);
setTimeout(function() {
document.body.removeChild(t);
}, 1000 * 3);
}