【问题标题】:Problem related to window.open() on Safari与 Safari 上的 window.open() 相关的问题
【发布时间】:2020-04-01 17:59:16
【问题描述】:

我知道 Safari 在 ajax 调用期间尝试通过 window.open() 阻止打开新标签。 我们需要在 ajax 调用之前调用 window.open() 来打开一个新标签,这样程序就可以防止 Safari 的阻塞。 以上参考,window.open(url, '_blank'); not working on iMac/Safari

但是,如果我想使用来自 ajax 调用的信息来验证我是否需要打开一个新选项卡,即有条件地打开一个新选项卡取决于 ajax 调用的验证,该怎么办?

然后我无法在 ajax 调用之前打开新标签页。这是因为如果验证未通过,那么我需要关闭在 ajax 调用之前打开的选项卡...,这不是我想要的程序的行为。

如果信息是通过 ajax 调用验证的,我如何才能打开一个新选项卡?谢谢大家的回答!

let newTab = window.open();

someAjaxChecking(...).then((isValid)=>{

   // isValid is a return boolean from the ajax calling someAjaxChecking() to 
   // determine whether redirect the new tab or close it

   if(isValid){
     newTab.location = url;
   }else{
     newTab.close(); // ***it is not desire to open and close the new tab...
   }

})

真实案例:

  • 我需要向我的后端发送一个表单(一组数据)来验证表单(一个 AJAX 调用);
  • 然后它会返回一个布尔值(isValid)来判断表单是否有效;
  • 如果 boolean(isValid) 为真,它将打开一个新选项卡

【问题讨论】:

    标签: javascript html ajax safari window.open


    【解决方案1】:

    如果我从用户的角度理解您网站上发生的情况是这样的:

    • 用户采取行动(例如点击按钮)
    • 您执行异步 AJAX 调用
    • 成功时(回调)会打开一个新窗口

    现在,您无法实现第三步,因为浏览器不允许您这样做。

    但是,您可以通过用户操作(例如单击按钮或其他元素)触发的回调打开新窗口。


    解决方案可能是:

    • 一旦您拥有要验证的数据,就执行 AJAX 调用
    • AJAX 回调存储结果(成功或不成功)。如果成功启用/显示一个按钮以打开新窗口
    • 单击(启用)按钮会触发打开新窗口的功能

    另一种解决方案是:

    • 用户输入数据
    • 用户点击按钮
    • 同步执行 AJAX 调用
    • 如果验证成功则打开新窗口

    【讨论】:

    • 感谢您的回复,保罗!根据您的回答,用户需要两个操作(第一次单击按钮以执行异步 AJAX 调用,然后第二次单击启用的按钮)来打开一个新窗口,对吗?如果我只想点击一下怎么办?鉴于 Safari 将阻止在 ajax 调用中对 window.open() 的任何调用。
    • @NathanW 一旦你有数据通过异步 ajax 调用执行验证(不需要用户点击按钮,你在后台执行) - 将验证结果存储在可以访问的地方稍后(例如全局变量) - 当用户单击按钮继续时,您只需检查验证结果(全局变量)
    • @NathanW se 也 我提出的第二个解决方案 - 请注意,这两种解决方案都需要用户单击一次
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2015-01-26
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多