美文网首页遇到问题, 解决问题
window.open 被浏览器阻挡

window.open 被浏览器阻挡

作者: CCCCong_e24b | 来源:发表于2019-07-16 20:22 被阅读0次

今天写代码遇到了window.open被浏览器阻拦的问题, 需求是发送一个ajax请求, 应答的对象里有value属性如果不为空, 就根据这个value的信息保存sessionStorage, 然后根据sessionStorage打开一个新页面, 显示商品详情页, 如果value属性为空, 就不打开新窗口, 在原窗口显示一下已有的基本信息.
经过试坑, 完成不了需求. 放弃了....试坑过程总结一下.

尝试失败的方法

angular的$watch服务

由于屏蔽原因可能是我在ajax回调里使用了window.open(), 所以思路是把window.open拿出来不放在回调里, 所以设置了个变量用于查看状态$scope.aaa, 在回调里改变值, 然后$scope.$watch监控变量, 然后调用window.open().
经过尝试这种方法还会被屏蔽.
失败

定时器方法

在回调里用了setTimeout, 再打开window.open(), 还被屏蔽.
失败

新建a标签, 使用a.click方法

解决window.open被浏览器拦截的问题


function newWin(url) { 
      var a = document.createElement('a');  
      a.setAttribute('href', url);
      a.setAttribute('style', 'display:none');  
      a.setAttribute('target', '_blank');  
      document.body.appendChild(a);
      a.click();
      a.parentNode.removeChild(a);  
}

不好使, 失败~

可能有用的方法

window.open 打开页面被浏览器阻挡的问题

(懒得试了, 即使好用也满足不了我的需求)

由于比较新的浏览器都加了一个机制,就是window.open不能够异步加载,也就是说,你用ajax请求了某个接口以后再去window.open一个新的页面,它很大可能被浏览器阻挡了,除非你调整了浏览器的机制。
那么有没有好的方法进行解决这个问题呢?
有的人说用window.location.href来跳转,这个在PC端可以,但是也是有一个问题就是会覆盖当前的页面。而且移动端,如果是打开doc或者pdf文件,Safari或者其它的一些浏览器还是会不跳转。
那么我们还是要回到window.open来进行方案布局了。
由于浏览器需要用户操作后才能够跳转,那么我们就在用户click或者touch等事件后直接调用一下window.open,至于第一个参数你传什么都没有所谓,如果要美观,可以传一个自己写好的loading页面,可以理解成为一个中转页面。
当你的url生成完,也就是异步回调后拿到了需要跳转的url,再去替换。
伪代码如下:

downloadProtocolInterFace(id) {
      let open = window.open('../download');//打开另一个页面被拦截的问题和window.location.href
      //下载协议,设计方案需要而录入方案无
      this.load = loading(this, "下载协议中...");
      let data = {
        plan_item_id: id //方案授予ID
      };
      approver
        .downloadProtocol(data)
        .then(res => {
          if (res.retCode === 0) {
            if(!open) {
              window.location.href = res.data.file_path;
            }else {
              open.location = res.data.file_path;
            }
          } else {
            this.errorShow(this.approverErrorData);
          }
          this.load && this.load.close();
        })
        .catch(err => {
          this.load && this.load.close();
          if (err && err.data && err.data.errMsg) {
            this.$message.error(err.data.errMsg);
            this.reload();
          }
        });
    },

作者:诸葛韩信
来源:CSDN
原文:https://blog.csdn.net/qq_31968791/article/details/93979310
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

网友评论

    本文标题:window.open 被浏览器阻挡

    本文链接:https://www.haomeiwen.com/subject/zlptlctx.html