ajax回调中打开新窗口如何避免被拦截?

苏子晨
  • 145

需求是这样的,有A,B两个页面,从A跳到B,发起ajax请求,成功后回到A,且阻止用户再回到B.

目前比较中意的解决方案是请求成功后直接新开一个窗口A,把原有窗口毙掉。

但遇到两个问题,如果在回调中执行window.open()会被浏览器拦截,网上的解决办法是在调用ajax请求前新开一个空白窗口,但这个操作也是需要用户点击才可以,如果ajax不是用户点击发起的还是会被拦截。

button.addEventListener('click', function() {
    var a = window.open('about:blank');// 写在ajax请求前
    setTimeout(() => {
      // 如果成功
      a.location.href = 'www.baidu.com';
      // 如果失败
      // a.close();
    }, 1000);
  })

  setTimeout(() => {
    // 不是用户自己点击的,还是会被拦截
    button.click();
  }, 2000);

还有就是关闭当前页也是个问题。

请问有没有更好的方案,急求

回复
阅读 2k
2 个回答
✓ 已被采纳

其实不需要“打开新窗口,关闭旧窗口”那么麻烦,你的期望不是“让用户没法再回到b”么?这个“没法回到”,我是不是可以这样理解,想阻止用户通过浏览器的“回退”键跳回b页面?

如果是的话,在你的ajax成功后,可以用location.replace(页面a的地址)来重定向到a页面,这样点“回退”是回不到页面b的

你说的这2个是浏览器的限制,起因是避免js滥用,这么规定已经很久了。如果不靠用户的真实点击触发,空白窗口就是会被屏蔽。
其他方法:
1.在当前页面创建一个浮动窗口(position),内嵌iframe。
2.做成app下一级页面打开效果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏