强制发布请求在新页面加载之前完成提交

时间:2012-04-30 21:36:02

标签: javascript jquery

我试图使用jQuery $ .post方法在点击某个元素时向PHP脚本提交ajax请求。我不关心服务器返回的值 - 我只是想确保我的数据已提交。

但是,接收点击的元素可能包含超链接图像或包含多个链接的flash元素。即使用户离开页面,我怎样才能确保我的脚本收到帖子请求(同样,我不关心它的响应)?我使用下面的代码:

jQuery(document).ready(function($) {
    $(".click-track").mousedown(function(e) { // click() will not pass through a flash movie, so we must use mousedown
        ad_id = $(this).data("ad-id");
        var data = {
            action: 'log_click',
            adId: ad_id
        };
        $.ajaxSetup({async: false});
        $.post(myscript.php, data, function(data) {
            // Do nothing because we don't care about the response
        }, 'html');
    });
});

我不是浏览器脚本大师,这段代码让我感到沮丧。我很感激你能给予的任何帮助!

3 个答案:

答案 0 :(得分:1)

处理Javascript中的重定向,并在收到回复后实现。另外,你可能不想要AJAX - 你可能想要一个同步帖子。

答案 1 :(得分:1)

如果你在mousedown处理程序中执行了e.preventDefault(),你可以在$ .post调用中执行此操作:

$(".click-track").mousedown(function(e) { // click() will not pass through a flash movie, so we must use mousedown
    e.preventDefault();
    ad_id = $(this).data("ad-id");
    var data = {
        action: 'log_click',
        adId: ad_id
    };
    $.ajaxSetup({async: false});
    var jqxhr = $.post(myscript.php, data, function(data) {
        // Do nothing because we don't care about the response

    }, 'html');
    jqxhr.complete(function(){ $(this).trigger('click'); });
});

这应该创建一个ajax对象,并在POST请求完成时附加一个函数,该函数应该触发对原始mousedown'd元素的单击。我已经将它与非Flash元素一起使用,不确定它是否适用于Flash对象,但它应该。

答案 2 :(得分:0)

如果你想强制你阻止代码直到帖子结束,我建议使用.ajax()代替并将async字段设置为false。像这样:

$.ajax({
 //some fields
 async:false,
 //some more fields
});

现在,您的js将一直阻止,直到呼叫返回。虽然我会警告你这不是首选。

编辑:如果元素是超链接,则需要调用event.preventDefault()。将链接的href属性设置为“javascript:void(0);”也是值得的。