jquery ajax发布取消了

我想跟踪一组页面上的一组UI组件上的鼠标单击事件。 为此,我使用以下jquery / ajax调用(修剪掉你):

1.Ajax调用将添加点击日志记录。

myClickLogger = { endpoint: '/path/to/my/logging/endpoint.html', logClickEvent: function(clickCode) { $.ajax({ 'type': 'POST', 'url': this.endpoint, 'async': true, 'cache': false, 'global': false, 'data': { 'clickCode':clickCode }, 'error': function(xhr,status,err){ alert("DEBUG: status"+status+" \nError:"+err); }, 'success': function(data){ if(data.status!=200){ alert("Error occured!"); } } }); } }; 

2.JQuery点击事件,它将调用ajax记录器(clickCode是单击按钮/图像的标识符):

 $(document).ready(function() { $(".myClickEvent[clickName]").click(function() { var clickCode = $(this).attr("clickName"); myClickLogger.logClickEvent(clickCode); }); }); 

只要跟踪的按钮点击进入新页面,浏览器就会“取消”上述ajax调用(1。)。

如果我将’aysnc’更改为’false’,则ajax调用成功。

此外,单击未进入新页面的事件也会成功。 仅取消进入新页面的点击事件。

我不想让呼叫同步。

任何想法,可能是什么问题? 当click事件进入新页面时,如何保证之前的异步调用完成?

因为它是异步的,所以代码将在日志记录发生之前完成。 你想要做的是将回调传递给异步调用。 这将保留异步属性,但仍允许您离开。 像这样的东西:

  logClickEvent: function(clickCode, callback) { $.ajax({ 'type': 'POST', 'url': this.endpoint, 'async': true, 'cache': false, 'global': false, 'data': { 'clickCode':clickCode }, 'error': function(xhr,status,err){ alert("DEBUG: status"+status+" \nError:"+err); }, 'success': function(data){ if(data.status!=200){ alert("Error occured!"); } else { callback(); } } }); } $(document).ready(function() { $(".myClickEvent[clickName]").click(function(e) { e.preventDefault(); // This will prevent the link from actually leaving right away var clickCode = $(this).attr("clickName"); var href = $(this).attr('href'); myClickLogger.logClickEvent(clickCode, function(href){ if (href) window.location = href; }); }); }); 

如果没有必要,您可能希望修改任何未离开页面的链接的回调。

您是否使用Firebug来跟踪请求? 如果是这样,那不完全正确。 如果您使用Fiddler检查请求,您可以看到它们是成功的。 取消状态通常意味着“浏览器取消等待响应”,无论如何你并不在乎。

我使用称为端点服务器的AJAX上的CORS头修复了问题。

另见: http : //blogs.mulesoft.org/cross-domain-rest-calls-using-cors/
另外: http : //www.biodalliance.org/cors.html