通过AJAX onclick传递数据

时间:2012-11-08 22:33:29

标签: javascript jquery ajax

当用户点击某个链接时,我想运行一个设置$_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;
});
});

2 个答案:

答案 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