2012-06-12 27 views
6

Chcę śledzić zdarzenia kliknięcia myszą na zestawie składników interfejsu użytkownika na zestawie stron. Aby to zrobić, używam następującego wywołania jquery/ajax (przycięte u):jquery ajax post anulowany

1. Wywołanie Ajax, które doda rejestrację kliknięć.

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 kliknij zdarzenie, które wywoła rejestrator ajax (the clickCode jest identyfikatorem, który przycisk/obraz został kliknięty): (. 1)

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

Powyższe wywołanie ajax jest " anulowane "przez przeglądarkę, gdy śledzone kliknięcie przycisku prowadzi do nowej strony.

Jeśli zmienię "aysnc" na "false", to wywołanie ajax zakończy się sukcesem.

Co więcej, zdarzenia klikania, które nie zostaną przeniesione na nową stronę, powiodą się. Tylko zdarzenia kliknięcia podejmowane na nowej stronie są anulowane.

Nie chcę, aby połączenie było synchroniczne.

Wszelkie pomysły, jaki może być problem? Jak mogę zagwarantować, że wywołanie asynchroniczne przed zakończeniem, gdy zdarzenie kliknięcia przejdzie na nową stronę?

+0

Musisz użyć synchronicznego połączenia, inaczej forma zostanie przedstawiony, a użytkownik zostanie przeniesiony do nowej strony. Kiedy formularz zostanie przesłany, strona zwalnia, a zatem połączenia AJAX są anulowane - tak działają przeglądarki ... – Ian

+0

Czy ktoś może mi powiedzieć o pojedynczym cudzysłowiu '' ', który jest używany w wywołaniu ajax? działa z pojedynczym cytatem również "typ" lub "sukces" i wszystko, ponieważ użyłem go bez pojedynczych cytatów .. –

+1

Nie musisz używać połączenia synchronicznego, musisz tylko upewnić się, że praca nie jest " t Sporządzono do momentu zakończenia połączenia asynchronicznego. –

Odpowiedz

3

Ponieważ jest to asynchroniczne, kod zostanie ukończony, zanim nastąpi rejestracja. To, co chcesz zrobić, to przekazać wywołanie zwrotne do połączenia asynchronicznego. Zachowa to właściwości asynchroniczne, ale nadal pozwoli Ci odejść. Coś takiego:

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

Prawdopodobnie będziesz chciał zmodyfikować zwrotnego dla jakichkolwiek powiązań, które nie są opuszczania strony, gdy nie jest to konieczne.

0

Czy używasz Firebug do śledzenia żądań? Jeśli tak, to nie jest całkowicie poprawne. Jeśli użyjesz Fiddlera do zbadania żądań, możesz zobaczyć, że się udało. Status anulowania oznacza przede wszystkim "przeglądarka anulowała oczekiwanie na odpowiedź", co i tak nie ma znaczenia.