1

我有一个表单,订阅者可以在其中选择他们想要接收的时事通讯,然后 AJAX 表单会将结果发送到 Exact Target 并将订阅者添加到订阅者想要添加的每个列表中。

我有一个 PHP foreach 循环设置来处理这个问题。

<?php foreach ($listNumbers as $item): ?>
            var xmlData = 'Ths is the ET API call';
            $.post('ET url for API call'+xmlData);      
        <?php endforeach; ?>    

循环运行后,用户会被发送到这样的感谢页面。

$(document).ready(function() {
location.href = "thank you url";
});

一切正常..在大多数情况下。我正在使用准备好的文档,因为我想给循环足够的时间来提交 API 调用。有没有办法检测 $.post 函数何时完成?如果成功了?然后将用户发送到感谢页面?

我发现在代码有机会运行之前,位置 href 正在将一些用户发送到感谢页面。

谢谢,迈克尔

4

3 回答 3

2

http://api.jquery.com/jQuery.post/

有一个回调告诉你它已经完成了

jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, dataType] )
  • url - 包含请求发送到的 URL 的字符串。
  • data - 与请求一起发送到服务器的映射或字符串。
  • success(data, textStatus, jqXHR) - 请求成功时执行的回调函数。
  • dataType - 来自服务器的预期数据类型。默认值:智能猜测(xml、json、脚本、文本、html)。

示例脚本,您需要跟踪所有请求是否已完成,尽管我强烈建议您编写一个新的服务器端调用,如果可以的话,您只能调用一次。

var xhrCount = <?= count($listNumbers) ?>;
<?php foreach ($listNumbers as $item): ?>
   var xmlData = 'Ths is the ET API call';
   $.post('ET url for API call'+xmlData, null, function() {
       xhrCount--;
       if (xhrCount === 0) {
           location.href = 'myurl'
       }
   });      
<?php endforeach; ?>  

不确定,您可能有什么问题,count()但您可以自己计算;

var xhrCount = 0;
<?php foreach ($listNumbers as $item): ?>
   var xmlData = 'Ths is the ET API call';
   xhrCount++;
   $.post('ET url for API call'+xmlData, null, function() {
       xhrCount--;
       if (xhrCount === 0) {
           location.href = 'myurl'
       }
   });      
<?php endforeach; ?>  
于 2012-04-05T15:41:16.137 回答
1
$(document).ready(function() { }); // this is NOT the callback of the AJAX request

以上将不起作用,因为它将立即被调用,因为您停留在同一页面上(已经准备好)。AJAX 调用是异步的,因此它不会等到请求完成。

您可以使调用异步或使用 ajax 请求的成功回调。

为了更好地澄清:

$(document).ready(function() {});DOM 准备好时触发(即有点像页面已加载并且我已准备好其他内容(例如附加事件侦听器))。你想要做的是使用.post()像这样的回调:

$.post('ajax/test.html', function(data) {
  // this only gets called when the ajax request is finished
});

但真正的问题仍然存在:为什么要使用 PHP 循环来构建 AJAX 请求。那根本没有意义。您仍在使用 PHP 构建页面,那么为什么不添加您想要使用 AJAX 获取的内容呢?

于 2012-04-05T15:41:48.923 回答
0

你可以试试这个 var jqxhr = $.post('ET url for API call'+xmlData);

循环后:

jqxhr.complete(function(){
  location.href = "thank you url";
});

您可以在文档中阅读有关 jqXHR 状态函数的信息

但是你可能想改变你的整个方法。也许你的 PHP 应该输出一个你的页面可以循环的 javascript 数组。你想达到什么目的?

于 2012-04-05T15:45:28.830 回答