2012-06-12 71 views
6

我想跟蹤一組頁面上的一組UI組件上的鼠標點擊事件。爲此,我正在使用以下jquery/ajax調用(刪除u):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是一個標識符用於哪個按鈕/圖像被單擊):(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調用中使用的單引號嗎?與單引號一起工作,還有''type''或''success'',因爲我沒有使用單引號.. –

+1

你不必使用同步調用,你只需要確保工作不是'直到異步調用完成後才完成。 –

回答

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

您可能會想修改的回調對於不離開頁面,當它是沒有必要的任何鏈接。

0

您是否使用Firebug來跟蹤請求?如果是這樣,那不完全正確。如果您使用Fiddler檢查請求,則可以看到它們成功。取消狀態通常意味着「瀏覽器取消等待響應」,無論如何你並不關心。