2011-04-23 53 views
1

我已在卸載事件上運行ajax-calls大約一年。 它一般在FF和IE工作,但不是100%,我不能說它什麼時候失敗。 我通過在bodytag中寫入事件來註冊事件:
onunload =「....」
由於卸載事件也想在剛剛卸載的頁面的div標記中寫入,所以我收到了FF4中的錯誤消息。修正了這個問題,如果目標div的id是'dummy',使得ajax-routine不會寫任何東西。 我不是AJAX專家,但下面的代碼已經工作: http://yorabbit.info/e-dog.info/tmp/ajax_ex.php(鏈接是文本頁)
你用以下參數調用ajaxfunction2:文件名,PHP的queryString,更新期間在目標div中顯示的字符串,目標div的名稱)
無法在Firefox 4中卸載事件觸發4

我在FF錯誤控制檯和IE9工作中沒有得到任何錯誤消息。 有什麼辦法可以讓它在FF中工作?我剛開始嘗試FF4,但我的印象是,它的工作不如FF3。

謝謝。

(我出門旅行,AY沒有立即回覆的可能性,但我真的很感激的建議,並會在適當時候回覆)

編輯: 我bettter補充一點: 的AJAX-調用我在卸載時只發送一些數據(用戶停留在頁面上的時間)到PHP-MySQL服務器

+0

是Ajax調用你做同步的嗎? – 2011-04-23 07:58:58

+0

我道歉,我不知道那是什麼? (我只是認爲AJAX是非同尋常的,因爲它的名字就是它。)我會試着去查找它。但我只是在頁面卸載時在鏈接http://yorabbit.info/e-dog.info/tmp/ajax_ex.php中執行例程。 – 2011-04-23 08:01:17

+0

我不知道這裏發生了什麼,但Firefox 4已經對卸載工作做了顯着的改變:例如,如果在鏈接點擊事件期間執行'alert()',它將不再凍結頁面,但無論如何加載新的位置。也許這是類似的東西 - 但你永遠不能保證Ajax調用完成,如果它不是異步的 – 2011-04-23 08:04:01

回答

1

我不知道這裏發生了什麼,但Firefox 4已經做出了顯着的改變卸載的工作原理:例如,如果您在鏈接單擊事件期間執行alert(),它將不再凍結頁面,而是加載新位置無論如何。也許這是類似的東西。

但是,你永遠保證Ajax調用來完成,如果它沒有在任何瀏覽器同步的反正 - 請求可能會或可能不會有反應回來,直到該頁面已經被關閉。這項工作是否會取決於用戶的網絡速度。

嘗試首先使用同步請求,因爲這裏概述:How does jQuery's synchronous AJAX request work?

這通常會保證要求回來。但是,使用它非常有效在頁面卸載時,謹慎屏蔽的行爲可能會讓用戶非常討厭,甚至會凍結瀏覽器。

+0

謝謝。但是因爲我在卸載瀏覽器/客戶端時什麼也沒做,我認爲它仍然可以工作?我只在卸載時將數據發送到PHP/MySQL服務器。但是我意識到我在這裏知道的太少,必須嘗試創建一個更簡單的測試環境來查看會發生什麼。非常感謝。 – 2011-04-23 08:37:12

+0

@ycc事情是,如果你做了一個正常的Ajax請求,你不能保證它會在頁面卸載之前到達服務器。這就是你50-70%的成功率來自哪裏。也許Firefox 4現在快速卸載頁面,以至於它永遠不會工作。如果你想得到一個保證的結果,你需要阻塞瀏覽器直到響應返回(=同步調用),但這對用戶來說可能是一個很大的煩惱,因爲它會延遲加載新頁面。 – 2011-04-23 08:40:07

+0

謝謝Pekka,你已經讓我前進了幾步。我理解你說的大部分內容。所以50-70%的成功率來自於AJAX調用和其他一般的「卸載」機制之間的某種競爭,而這種機制根本不允許發送AJAX調用?這是瀏覽器中的「競爭」,還是會通過互聯網向服務器發送「卸載」消息,這可能會取消AJAX請求? (好吧,也許不是那麼容易回答,對不起,如果問題不合邏輯) – 2011-04-23 08:47:54

1

我建議使用jQuery,而不是自己跟蹤瀏覽器更改。

解決方案:
找到工作的樣品在這裏:http://jsfiddle.net/ezmilhouse/4PMcc/1/

假設你的內部鏈接相對設置,因此你的外部鏈接集開始以 'http':

<a href="http://google.com">Leave ...</a> 
<a href="/home.html">Stay ...</a> 

你可以通過jQuery事件劫持'a'標籤,並要求用戶確認離開(在外部鏈接的情況下)。在「OK」的情況下,你脫掉你的「onleave」 AJAX調用(異步=真)和重定向用戶到外部鏈接:

$('a').live('click', function(event){ 

    // cache link 
    var link = $(this).attr('href'); 

    // check if external link (assuming that internal links are relative) 
    if (link.substr(0,4) === "http") { 

     // prevent default a tag event 
     event.preventDefault(); 

     // popup confirm message 
     var reply = confirm('Do you really want to leave?'); 
     if (reply) { 

      var url = 'http:mydomain.com/ajax.php'; 
      var data = {'foo': 'bar', 'fee':'bo'}; 

      // kick off your 'onleave' ajax call 
      // forced to be synchronous 
      $.ajax({ 
       type: "POST", 
       async: false, 
       url: url, 
       data: data, 
       success: function(data) { 

        // ok case: leave page, cached link 
        window.location.href = link; 

       } 
      }); 

     } 

     return false; 

    } 

}); 
+0

OP在事件中發出Ajax請求,使用jQuery不會改變這種情況 – 2011-04-23 08:22:23

+0

jQuery是否可能以另一種方式使AJAX調用以某種方式在FF4中比我的更好?在那種情況下,我可能會嘗試嗎? (我的電話:http://yorabbit.info/e-dog.info/tmp/ajax_ex.php我通過剪切,粘貼和修改得到了這個,抱歉沒有適當的學分。) – 2011-04-23 08:39:29

+1

+1對於一個很好的解決方案建議,儘管我認爲這對於OP來說並不足夠,因爲他想跟蹤頁面上的時間,並且需要捕獲所有卸載事件 - 關閉瀏覽器也會結束查看頁面。儘管如此,在許多情況下,這可能很有用 - 請記住,應該非常小心地使用阻止Ajax調用 – 2011-04-23 11:33:38