2012-06-12 5 views
6

Я хочу отслеживать события щелчка мыши на наборе компонентов пользовательского интерфейса на множестве страниц. Для этого я использую следующий вызов jquery/ajax (обрезанный u):jquery ajax post отменен

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 нажмите событие, которое будет вызывать АЯКС регистратор (The clickCode является идентификатором, для которого кнопка/изображения была нажата): (. 1)

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

выше Ajax вызова " отменяется "браузером всякий раз, когда щелчок на кнопке отслеживается, переходит на новую страницу.

Если я изменяю 'aysnc' на 'false', то вызов ajax завершается успешно.

Кроме того, нажмите события, которые не попадают на новую страницу, не удастся. Отмена только событий кликов на новую страницу отменяется.

Я не хочу, чтобы звонок был синхронным.

Любые идеи, что может быть проблемой? Как я могу гарантировать, что асинхронный вызов до этого будет завершен, когда событие click перейдет на новую страницу?

+0

Вы должны использовать синхронный вызов, в противном случае форма будет отправлена, и пользователь будет принимать на новую страницу. Когда форма отправляется, страница выгружается, и поэтому вызовы AJAX отменены - вот как работают браузеры ... – Ian

+0

может ли кто-нибудь рассказать мне о одиночных кавычках '' '', которые используются в вызове ajax? это работа с одной цитатой также «тип» или «успех», и все потому, что я использовал без одинарных кавычек. –

+1

Вам не нужно использовать синхронный вызов, вам просто нужно убедиться, что работа isn ' t до завершения асинхронного вызова. –

ответ

3

Поскольку это асинхронный код, код будет завершен до того, как произойдет ведение журнала. То, что вы хотите сделать, это передать обратный вызов в асинхронный вызов. Это сохранит свойства async, но все же позволит вам уйти. Что-то вроде этого:

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; 
     }); 
    }); 
}); 

Вы, вероятно, хотите изменить функцию обратного вызова для любых ссылок, которые не покидают страницу, когда это не нужно.

0

Вы используете Firebug для отслеживания запросов? Если это так, это не совсем правильно. Если вы используете Fiddler для проверки запросов, вы можете увидеть, что они успешны. Отмененный статус в основном означает «браузер отменен в ожидании ответа», который вам все равно не нравится.