当用户点击某个链接时,我想运行一个设置$_SESSION
变量的AJAX调用,同时仍然将用户引导到链接的href
。
当我运行以下代码时,Firebug显示存在错误,但未指定;我readyState=0, status=0, statusText="error"
获得的是console.log
。
如果我将e.preventDefault
和window.location.href = linkPath;
添加到我的success
函数中,脚本会将用户发送到正确的位置;但只有在等待php页面完成后才会延迟。
如何在仍然将用户毫无延迟地传递给他们的链接的同时运行AJAX调用?
$(document).ready(function() {
$(".example_class").click(function(e) {
//Stop the page from leaving until we start our ajax
//e.preventDefault();
//var linkPath = this.href;
var form_data = new Object();
//Set the application ID for insert into the DB
form_data.variableName = encodeURIComponent('ExampleName');
//Send the data out to be processed and stored
$.ajax({
url:'/mypath/myfile.php',
type:'POST',
data:form_data,
success:function(return_data){
//window.location.href = linkPath;
return;
},
error:function(w,t,f){
console.log(w);
return;
}
});
return;
});
});
答案 0 :(得分:1)
正如在演讲中所说,当调用者页面被卸载时,ajax调用被中止。 但这并不意味着服务器没有收到呼叫,它只意味着服务器没有发回回复。 为了最大限度地减少ajax调用所花费的时间,你可以等待第一次响应ajax调用“xhr.onprogress”(在jquery的$ .ajax中没有实现),然后打开链接。
但是,如果您拥有对服务器的控制权,只需将'/mypath/myfile.php?redirect_url='+linkPath重定向到linkPath:
header('location: '.$_GET['redirect_url']);
答案 1 :(得分:0)
进行ajax调用,然后重定向用户。 ajax调用将在window.location更改之前发送。你唯一不能解释的是ajax调用是否失败。
$(".example_class").click(function(e) {
var linkPath = this.href;
var form_data = new Object();
//Set the application ID for insert into the DB
form_data.variableName = encodeURIComponent('ExampleName');
//Send the data out to be processed and stored
$.ajax({
url:'/mypath/myfile.php',
type:'POST',
data:form_data,
success:function(data){ alert('never alerts but request sent to server.'); },
error:function(){ alert('page changes, but ajax request failed, sorry.'); }
});
window.location.href = linkPath;
return;
});
另一个选项是使用ajax调用设置onbeforeunload event。