2012-06-12 40 views
6

Bir dizi sayfadaki bir dizi UI bileşenindeki fare tıklaması olaylarını takip etmek istiyorum. Bunu yapmak için , aşağıdaki jquery/ajax çağrısı kullanıyorum (u kırpılmış): jquery ajax post iptal edildi

1.Ajax çağrısı, günlüğe kaydetme günlüğünü ekler. ajax logger arayacak

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 tıklama etkinlik (clickCode düğmesi/resim tıklanan olduğu için tanımlayıcılardır): (. 1)

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

yukarıdaki ajax çağrıdır " "Tıkla" butonu tıkladığınızda tarayıcı tarafından yeni bir sayfaya geçilir.

'Aysnc' öğesini 'false' olarak değiştirirseniz, ajax çağrısı başarılı olur.

Ayrıca, yeni bir sayfaya götürmeyen olayların başarılı olması için tıklatın. Sadece yeni sayfaya giden tıklama etkinlikleri iptal ediliyor.

Aramayı eşzamanlı yapmak istemiyorum.

Herhangi bir fikir, sorun ne olabilir? Tıklama etkinliği yeni bir sayfaya götürüldüğünde, önce eşzamansız çağrının bittiğini nasıl garanti edebilirim?

+0

Sen, bir senkron çağrı kullanmak zorunda aksi formu sunulacak ve kullanıcı yeni bir sayfaya alınacaktır. Form gönderildiğinde, sayfa kaldırılır ve bu nedenle AJAX çağrıları iptal edilir - tarayıcılar bu şekilde çalışır ... – Ian

+0

Herkes bana ajax çağrısında kullanılan tek tırnak '' ''hakkında bilgi verebilir mi? Tek tırnak ile de çalışır '' tip '' veya '' başarı '' ve hepsi tek tırnak kullanmadan kullandığım .. –

+1

Eşzamanlı bir çağrı kullanmak zorunda değilsiniz, sadece işin olduğundan emin olmalısınız. Async çağrısı bittikten sonra yapılana kadar. –

cevap

3

Zaman uyumsuz olduğundan, günlüğe kaydetmeden önce kod tamamlanır. Yapmak istediğiniz şey, async çağrısına bir geri bildirimi iletmektir. Bu, async özelliklerini korur, ancak yine de gitmenize izin verir. Böyle bir şey: Muhtemelen gerekli olmadığı zamanlarda, sayfadan ayrılmadan olmayan tüm bağlantılar için geri arama değiştirmek isteyeceksiniz

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

İstekleri izlemek için Firebug kullanıyor musunuz? Eğer öyleyse, bu tamamen doğru değil. Talepleri incelemek için Fiddler'ı kullanırsanız, bunların başarılı olduğunu görebilirsiniz. İptal edilen durum çoğunlukla "tarayıcı yanıt beklemeyi iptal etti" anlamına gelir.