我想跟踪一组页面上的一组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事件进入新页面时,如何保证之前的异步调用完成?
答案 0 :(得分:3)
因为它是异步的,所以代码将在日志记录发生之前完成。你想要做的是将回调传递给异步调用。这将保留异步属性,但仍允许您离开。像这样:
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;
});
});
});
如果没有必要,您可能希望修改任何未离开页面的链接的回调。
答案 1 :(得分:0)
您使用Firebug跟踪请求吗?如果是这样,那不完全正确。如果您使用Fiddler检查请求,您可以看到它们是成功的。取消状态主要是“浏览器取消等待响应”,无论如何你都不关心。
答案 2 :(得分:0)
我使用名为端点服务器的AJAX上的CORS标头进行了修复。
另见:http://blogs.mulesoft.org/cross-domain-rest-calls-using-cors/
另外:http://www.biodalliance.org/cors.html