我有一个表单,订阅者可以选择他们想要收到的新闻稿,然后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会在代码有机会运行之前将某些用户发送到感谢页面。
谢谢, 迈克尔
答案 0 :(得分:2)
http://api.jquery.com/jQuery.post/
有一个回调告诉你它已经完成了
jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, dataType] )
示例脚本,您需要跟踪所有请求已完成,但我强烈建议您编写一个新的服务器端调用,如果可以,您只能调用一次。
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; ?>
答案 1 :(得分:1)
$(document).ready(function() { }); // this is NOT the callback of the AJAX request
以上操作不起作用,因为它会立即被调用,因为你停留在同一页面上(已经准备好了)。 AJAX调用是异步的,所以它不会等到请求完成。
您可以使调用异步或使用ajax请求的成功回调。
为了更好地澄清:
当DOM准备就绪时$(document).ready(function() {});
触发(即有点像页面已加载并且我已准备好接收其他内容(例如附加事件监听器))。你想要做的是使用.post()
的回调,如:
$.post('ajax/test.html', function(data) {
// this only gets called when the ajax request is finished
});
但真正的问题仍然存在:为什么使用PHP循环来构建AJAX请求。这完全没有意义。您仍在使用PHP构建页面,那么为什么不使用AJAX添加要获取的内容?
答案 2 :(得分:0)
你可以尝试这个var jqxhr = $.post('ET url for API call'+xmlData);
循环之后:
jqxhr.complete(function(){
location.href = "thank you url";
});
您可以在documentation中阅读有关jqXHR状态函数的信息。
但您可能想要改变整个方法。也许你的PHP应该输出一个你的页面可以循环的javascript数组。你想要完成什么?