2013-04-10 50 views
17

我需要在PHP頁面中調用一個JavaScript代碼/ jQuery函數,該代碼中包含幾行代碼,當用戶關閉他的窗口/選項卡或通過單擊鏈接導航時。我試過onbeforeunload函數,但只有return "blah blah blah;"部分執行,其他所有內容都被忽略。我也嘗試了jQuery的.unload方法,但由於某些原因,此代碼無法運行。用戶導航時觸發一個事件

$(window).unload(function() { 
    alert('blah blah blah'); 
}); 

請提出替代方案。謝謝..

+1

你想在卸載時做什麼? – writeToBhuwan 2013-04-10 12:02:41

+1

我需要對PHP進行Ajax調用以取消設置會話變量。 – 2013-04-10 12:03:47

+0

'通過點擊鏈接導航'這表明你必須綁定文檔 – muneebShabbir 2013-04-10 12:04:00

回答

13

這是一個簡單的工作示例。無論你returnunload回調將顯示在瀏覽器彈出確認。

工作實例發送Ajax請求之前卸載 http://jsfiddle.net/alexflav23/hujQs/7/

要做到這一點最簡單的方法:

window.onbeforeunload = function(event) { 
    // do stuff here 
    return "you have unsaved changes. Are you sure you want to navigate away?"; 
}; 

jQuery中:

$(window).on("beforeunload", function() { 
    $.ajax("someURL", { 
     async: false, 
     data: "test", 
     success: function(event) { 
      console.log("Ajax request executed"); 
     } 
    }); 
    return "This is a jQuery version"; 
}); 

查找到的網絡選項卡瀏覽器。您將看到如何按照您的要求發送請求。只需發送適當的數據。

請記住,所有觸發的操作都必須是同步的,因此您只能爲同步發送同步ajax請求。但是,上述內容對於任何目的都不完全可靠。

選擇定期備份用戶數據至localStorage並自動與服務器同步。保持window.onbeforeunload只是一種額外的預防措施,但不是一個主要機制。衆所周知會造成問題。

+0

這不起作用。無論用戶是否確認警告,總是會調用beforeunload。我需要運行一些清理,但我只想運行清理,如果用戶ACTUALLY導航。我怎樣才能做到這一點? – 2016-04-26 20:33:47

+0

@JohnHenckel沒有辦法做到這一點。 – apscience 2016-05-24 00:32:36

+1

@apscience,謝謝。似乎這是瀏覽器規範中的一個缺陷。例如,我想創建一個網頁來編輯數據庫中的一行,並且我想鎖定該行以防止其他用戶更改它。我發現的唯一解決方案是每隔幾秒向服務器發送一次心跳信號,以便服務器知道何時解除鎖定。然而,這存在一個嚴重的缺陷,因爲當任何「確認」框打開時,JS引擎暫停,因此心跳停止,即使用戶仍在編輯!也許有一天瀏覽器將取代操作系統,但現在它很適合作爲應用程序平臺! – 2016-05-24 14:33:10

相關問題