3

当用户单击某个链接时,我想运行一个设置 $_SESSION变量的 AJAX 调用,同时仍将用户指向链接的href.

当我运行以下代码时,Firebug 显示有错误,但没有指定;readyState=0, status=0, statusText="error"是我从中得到的全部console.log

如果我添加e.preventDefaultwindow.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;
});
});
4

2 回答 2

1

正如评论中所说,当调用者页面被卸载时,ajax 调用被中止。但这并不意味着服务器没有收到呼叫,它只意味着服务器没有回复。为了最大限度地减少 ajax 调用所花费的时间,您可以使用“xhr.onprogress”(未在 jquery 的 $.ajax 中实现)等待对 ajax 调用的第一个响应,然后打开链接。

但是,如果您拥有服务器的控制权,只需将 '/mypath/myfile.php?redirect_url='+linkPath 重定向到 linkPath :

header('location: '.$_GET['redirect_url']);
于 2012-11-08T22:58:16.190 回答
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 事件。

于 2012-11-08T22:41:00.373 回答