1

我正在尝试使用 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');
    });
});

我不是浏览器脚本专家,这段代码让我很困惑。我将不胜感激您能提供的任何帮助!

4

3 回答 3

1

在 Javascript 中处理重定向,并在收到响应后使其发生。此外,您可能不想要 AJAX——您可能想要同步发布。

于 2012-04-30T21:38:47.290 回答
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 元素的单击。我已经让它与非 Flash 元素一起使用,不确定它是否适用于 Flash 对象,但它应该。

于 2012-04-30T21:50:36.047 回答
0

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

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

现在,您的 js 将阻塞,直到调用返回。虽然我会警告你这不是首选。

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

于 2012-04-30T22:30:15.870 回答