2011-06-09 21 views
5

我正在寫一個小腳本來捕獲鏈接點擊並將鏈接的URL保存到數據庫表中,以便跟蹤特定頁面上每個鏈接點擊的次數。鏈接指向外部網站。AJAX Post被重定向取消

因此,我在JavaScript函數中捕獲click事件,使用jQuery發佈到PHP頁面,該頁面將數據保存在MySQL中,然後JavaScript函數將用戶重定向到他們單擊的鏈接的URL。

我遇到的問題是,好像帖子永遠不會完成,因爲重定向。我已經通過調用post回調中的重定向來解決這個問題,但是這會增加幾秒鐘的延遲,因爲直到帖子完成後它纔會被調用。我正在尋找一種方法來發布數據並立即重定向用戶,無論帖子是否成功或失敗。

這是解決方法的當前代碼。它工作正常,但將延遲:

function trackClicks(event) 
{ 
    var clicked = $(this).attr('href'); 

    $.post 
    (
     $('#track-click-post-url').attr('value'), 
     { 
      action: 'track_landing_page_clicks', 
      clicked_url: clicked, 
      nonce: $('#track-click-nonce').attr('value') 
     }, 
     function(response) 
     { 
      window.location = clicked; 
     } 
    ); 

    event.preventDefault(); 
} 

這是我想要做什麼,但是當我嘗試它從來沒有完成:

function trackClicks(event) 
{ 
    var clicked = $(this).attr('href'); 

    $.post 
    (
     $('#track-click-post-url').attr('value'), 
     { 
      action: 'track_landing_page_clicks', 
      clicked_url: clicked, 
      nonce: $('#track-click-nonce').attr('value') 
     } 
    ); 

    window.location = clicked; 
    event.preventDefault(); 
} 

回答

7

jQuery不會爲您正在尋找的內容提供回調。以下是可用的就緒狀態:

Value State Description 
0 UNSENT open()has not been called yet. 
1 OPENED send()has not been called yet. 
2 HEADERS_RECEIVED send() has been called, and headers and status are available. 
3 LOADING Downloading; responseText holds partial data. 
4 DONE The operation is complete. 

您正在尋找的readyState 2,因爲這是你意識到,服務器接收到消息的事實,最早的。

這應該讓你掉在地上:

var xhr = new XMLHttpRequest(); 
xhr.open("POST", clicked); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState >= 2) window.location = clicked; 
}; 
xhr.send($('#track-click-post-url').attr('value')); 

https://developer.mozilla.org/en/XMLHttpRequest進一步閱讀。

+0

+1 for readyState,但服務器是否會繼續處理請求,即使您要離開頁面? – 2011-06-09 21:17:56

+1

@Rocket,它在服務器發送標題和狀態碼後觸發。在執行SQL操作之前,確實可以發送標頭和狀態碼,但除非他特意這麼做,否則假設服務器在請求開始響應時完成服務可能是安全的(否則它會如何知道它需要扔500等)。 – Robert 2011-06-09 21:25:18

+0

啊,好的。聽起來像這樣可能會奏效。 – 2011-06-09 21:37:31

0

當你離開一個頁面,所有待處理請求被終止,並加載新的頁面。第一種方式是正確的方式。是的,單擊鏈接時會有延遲,這是因爲POST請求正在運行。

如果用戶不在該頁面上,則無法在頁面的後臺運行請求。

也許您可以將鏈接URL保存在cookie中,並在下一頁加載時將其放入數據庫。

+1

嗯,我並不關心交易是否完成。我想在請求發送到服務器後立即重定向它們,而不管之後會發生什麼。我不需要得到任何迴應。所以,等待這些0.5-1.5秒似乎是一種浪費。 – 2011-06-09 21:45:00

0

爲什麼當你打算以任何方式加載一個頁面時使用JavaScript?

只需使用新頁面上單擊的鏈接更新數據庫即可。

也許使用引薦來源網址來跟蹤點擊的網頁。

或者其他一些解決方案來獲取點擊的網頁(例如url參數)或其他方式。

+0

鏈接指向外部頁面。我會更新這個問題來澄清這一點。 – 2011-06-09 21:42:36