-1

我有一个 AJAX 功能,需要一些时间才能完成。完成后,我想打开一个带有结果的新选项卡。为此,我提出了三个选项:

  1. 使用来自 AJAX 调用的 window.open()
  2. 在 javascript 函数/事件触发器中使用 window.open()。
  3. 在 javascript 函数/事件触发器中的 setTimeout-function 中使用 window.open()。

问题是这必须适用于所有主要浏览器(IE、Chrome、Firefox 和 Safari),选项 3 应该可以解决问题,但会产生不必要的副作用:

  1. 在 Chrome 中,该窗口不是在新选项卡中打开,而是作为弹出窗口打开。
  2. 在 Safari 中,内部弹出防止被激活;导致无法打开弹出窗口。(来源

现在我想将 setTimeout() 用作一段程序代码并最终得到一些类似的东西:

$('.selector').click(function() { 
  doAjaxCall();
  setTimeout(function(){ }, 150);
  window.open(...);
});

好吧,这适用于 Safari,但 Chrome 和 FireFox 似乎忽略了 setTimeout() 并直接继续到 window.open()。这就是我的问题;当 window.open() 被调用时,必须使用的数据并不总是最新的。

所以,我在这里。回归本源。弄清楚症状是什么,知道我探索的场景的缺点并最终得到这样的结果:

$('.selector').click(function() { 
  doAjaxCall();
  for(i = 0; i <= 100000000; i++) { 
    // procedural and time consuming so doAjaxCall has enough time to complete 
  }
  window.open(...);
});

就我而言,我坚持使用xajax进行 ajax 处理,所以我不能使用 jQuery 的 ajax 解决方案。

关于如何改进这一点的任何建议?导致在 ajax 功能完成时所有主要浏览器都打开弹出窗口的解决方案?

4

1 回答 1

1

首先,浏览器不会忽略 setTimeout 函数,但执行不会停止并等待 setTimeout 完成,而是会继续执行并等待超时完成以执行作为参数传递给的方法设置超时方法。

但是你不需要从 php 模拟 sleep 方法来实现你想要的。ajax 调用有一个成功事件,您可以在其上附加一个事件处理程序。成功事件发生时打开新选项卡。否则,您将无法确切知道 ajax 请求何时结束。如果你不能使用 jQUery 的 ajax,你可以创建一个 'old-school' ajax 请求,就像这里

此外,打开一个新窗口并不是最好的解决方案,因为大多数浏览器都有弹出窗口阻止程序。

于 2013-10-25T14:50:18.810 回答