1

當用戶在我的應用程序中編輯記錄時,我跟蹤他們已將其鎖定,以防止另一個用戶在第一個用戶關閉窗口(或保存)之前對其進行編輯。在onbeforeunload事件中向服務器發送請求

我試圖將請求發回服務器解鎖記錄,但它不能在Firefox中工作。 onbeforeunload事件在腳本中被調用,但不會將請求發送回服務器。 任何想法?

<body> 
<script> 
    window.onbeforeunload = function (e) { 
     doUnlock(); 
    } 

function doUnlock() { 
    if (navigator.appName == 'Microsoft Internet Explorer') { 
     // works in IE (with an IFRAME) 
     utilFrame.location.href = "/unlock.do?recordId=" + recordId; 
    } else if (navigator.appName == 'Netscape') { 
     // None of this works.... 
     //window.location.href = "/unlock.do?recordId=" + recordId; 
     var req = newXMLHttpRequest(); 
     req.open("GET", "/unlock.do?recordId=" + recordId, true); 
     req.send(); 
    } else { 
     // Works for chrome 
     window.open("/unlock.do?recordId=" + recordId); 
    } 
} 

</script> 
+0

不知道這是否是一個錯字,但是您忘記了new和XMLHttpRequest()之間的空格。 – TheShellfishMeme 2012-02-19 16:43:28

+0

是的,我應該包括那裏的空間。 – sproketboy 2012-02-19 16:51:16

回答

3

newXMLHttpRequest之間加一個空格。

在頁面卸載時,任何待處理(AJAX)請求* 取消。如果你必須發送一個Ajax請求上卸載服務器上,使用同步請求(不推薦!!!):

var req = new XMLHttpRequest(); 
    req.open("GET", "/unlock.do?recordId=" + recordId, false); // false 
    req.send(); 

我不建議同步請求,因爲用戶界面阻塞,直到請求已完成。這不是非常用戶友好的。

+1

謝謝!這讓我瘋狂。同步不是一個問題,因爲我不需要返回任何東西。只要它被稱爲一切都很好。 – sproketboy 2012-02-19 16:50:54

+0

@DanHoward考慮爲chrome實現XMLHttpRequest方法。彈出窗口非常煩人,並且可能被彈出窗口阻止程序阻止。 – 2012-02-19 17:05:32

+0

我正在開發一個Web應用程序,其中一個請求(異步)正在卸載中發送,並且它工作得很好。 – user123444555621 2012-02-19 17:46:44

2

你應該看看使用基於時間的鎖。當用戶開始編輯記錄時,用時間戳將其鎖定。每30秒鐘發送一次來自用戶的ping,記錄應該仍然被鎖定。如果60秒內沒有ping通,則解鎖記錄。

+0

謝謝。這是一個有趣的方法,但需要2個定時器。在服務器上,定時器會引入線程問題。 – sproketboy 2012-02-20 16:15:53

+0

我其實並沒有很好地表達它,但你只需要客戶端上的一個定時器。在後端,您可以在返回記錄之前執行'如果lock_timestamp + 60> current_timestamp:locked = true'。 – abraham 2012-02-20 18:17:09

相關問題