你知道window.open(url)被浏览器拦截器阻止怎么解决嘛?

399 阅读2分钟

我正在参加「掘金·启航计划」

情况

在一个项目中唤醒另一个项目 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);
        }