2010-06-17 11 views
5

ठीक है, मुझे निम्नलिखित कोड के साथ कोई समस्या है। क्या होता है जब कोई उपयोगकर्ता अपने ब्राउज़र को बंद करता है, तो उसे या तो ठीक क्लिक करने के लिए संकेत देना चाहिए या पृष्ठ छोड़ने के लिए कैंसल पर क्लिक करना चाहिए। ठीक क्लिक करने से उपयोगकर्ता ट्रैकिंग के लिए किसी अन्य पृष्ठ पर रीडायरेक्ट करने के लिए एक विंडो। स्थानांतरित हो जाएगा (और हाँ, लौ युद्धों से बचने के लिए, उपयोगकर्ता को कार्य प्रबंधक से ब्राउज़र को मारने की स्थिति में सटीक ट्रैकिंग सुनिश्चित करने के लिए एक माध्यमिक प्रणाली होती है (जैसा कि समान प्रश्नों में उल्लिखित है))। कैंसल पृष्ठ पर रहेगा, यह मुद्दा यह है कि इससे कोई फर्क नहीं पड़ता कि आप किस बटन पर हिट करते हैं, आप रीडायरेक्ट हो जाते हैं जैसे कि आप पृष्ठ छोड़ना चाहते हैं। प्रासंगिक कोड नीचे है।जावास्क्रिप्ट onbeforeunload समस्या

window.onbeforeunload = confirmExit; 
function confirmExit() 
{ 
    var where_to = confirm("Click OK to exit, Click CANCEL to stay."); 
    if (where_to == true) 
    { 
     window.location="logout.php"; 
    } 
    if (where_to == false){ 
     alert("Returning..."); 
    } 
} 

उत्तर

6

onbeforeunload इस तरह से काम नहीं करता है। संबंधित फ़ंक्शन को एक स्ट्रिंग को वापस करना चाहिए जो बदले में डिफ़ॉल्ट onbeforeunload संवाद पर प्रदर्शित किया जाना चाहिए।

function confirmExit() { 
    return "This message will appear in the dialog."; 
} 

लेकिन आप कुछ भी वापस नहीं कर रहे हैं और एक confirm() साथ अपने स्वयं के हाथों में ले रही है। जब फ़ंक्शन कुछ भी वापस नहीं करता है, तो onbeforeunload संवाद बिल्कुल प्रदर्शित नहीं होगा।

असली लॉगआउट का आह्वान करने के लिए, आप onunload ईवेंट का उपयोग करना चाहते हैं। यहाँ एक पुनर्लेखन है:

window.onbeforeunload = confirmExit; 
window.onunload = logout; 

function confirmExit() { 
    return "Click OK to exit, Click CANCEL to stay."; 
} 

function logout() { 
    window.location = 'logout.php'; 
} 

आप तथापि webbrowser पर निर्भर है कि क्या वास्तव में अंतिम इच्छा सर्वर हिट कर रहे हैं। अधिकांश यदि वेब ब्राउजर नहीं करते हैं। मैं उस यूआरएल पर एक अजीब अनुरोध आग लगाना चाहता हूं, लेकिन आप वेबब्रोसर पर भी निर्भर हैं कि यह बेकार ढंग से काम करेगा।

+0

अजाक्स अनुरोध काम नहीं करते। मेरा मतलब है, वे काम करते हैं, लेकिन कभी-कभी उनके पास वास्तव में अनलोड होने से पहले पूरा करने के लिए पर्याप्त समय नहीं होता है। हमने इस तकनीक को हमारी विकास मशीन पर आजमाया है, और यह सुनिश्चित करने का एकमात्र तरीका है कि अनुरोध पूरा हो जाएगा यह सिंक्रोनस बनाकर है। जो आईई के साथ वास्तव में बड़ी समस्याएं पैदा करता है, क्योंकि इसमें प्रति ब्राउज़र उदाहरण AJAX अनुरोधों का सीमित ढेर है। –

+0

@ इगोर: उचित बिंदु। मैंने फिर से एक और स्थानीय परीक्षण किया और यह आईई 8 और क्रोम पर काम करता है, लेकिन एफएफ 3 और सफारी 4 पर नहीं। – BalusC

+0

@ IgorZinov'yev अगर आप AJAX कॉल आग लगाना भूल जाते हैं और भूल जाते हैं तो आप इसे बिना किसी समस्या के प्राप्त कर सकते हैं। कॉल हमेशा सर्वर पर हिट करेगा। – thomaux

0

शायद बजाय उपयोगकर्ता के ब्राउज़र आप अपने unbeforeunload अंदर से एक XHR अनुरोध आग सकता है अपहरण के() और डेटा आप के लिए पर भेजा जहां आपको उसकी आवश्यकता की जरूरत है?

अधिक उपयोग के मामले के बिना यह कहना मुश्किल है, लेकिन यह एक अच्छा विकल्प प्रदान कर सकता है।

0

IE9 और क्रोम

में परीक्षण किया गया
function addEvent(elm, evType, fn, useCapture) { 
    if (elm.addEventListener) { 
    elm.addEventListener(evType, fn, useCapture); 
    return true; 
    } 
    else if (elm.attachEvent) { 
    var r = elm.attachEvent('on' + evType, fn); 
    return r; 
    } 
    else { 
    elm['on' + evType] = fn; 
    } 
} 

function exitAlert(e) { 
    var msg = "This message will appear in the dialog."; 
    if (!e) { e = window.event; } 
    if (e) { e.returnValue = msg; } 
    return msg; 
} 

addEvent(window, 'beforeunload', exitAlert, false); 
संबंधित मुद्दे