2013-03-07 8 views
5

मेरे पास window.onbeforeunload ठीक से ट्रिगर कर रहा है। यह सुनिश्चित करने के लिए एक पुष्टिकरण बॉक्स प्रदर्शित कर रहा है कि उपयोगकर्ता को पता है कि वे विंडो को नेविगेट कर रहे हैं (बंद कर रहे हैं) और कोई भी सहेजा गया काम मिटा दिया जाएगा।विंडो का पता लगाने के लिए कैसे पता लगाया जाए कि क्या एक लिंक क्लिक किया गया था .onbeforeunload ट्रिगर किया गया है?

मेरे पास एक अनूठी स्थिति है जहां मैं एक लिंक पर क्लिक करके पृष्ठ से दूर जाने पर यह ट्रिगर नहीं करना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि फ़ंक्शन के अंदर कोई लिंक क्लिक किया गया है या नहीं समारोह को रोकने के लिए। कोड के लिए मेरे पास यही है:

window.onbeforeunload = function() { 
var message = 'You are leaving the page.'; 

/* If this is Firefox */ 
if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    if(confirm(message)) { 
    history.go(); 
    } 
    else { 
    window.setTimeout(function() { 
     window.stop(); 
    }, 1); 
    } 
} 
/* Everything else */ 
else { 
    return message; 
} 
} 

उत्तर

6

आप स्थगित ईवेंट हैंडलिंग की तलाश में हैं। मैं jQuery का उपयोग कर के बारे में समझाएंगे, के रूप में यह कम कोड है:

window._link_was_clicked = false; 
window.onbeforeunload = function(event) { 
    if (window._link_was_clicked) { 
    return; // abort beforeunload 
    } 
    // your event handling 
}; 

jQuery(document).on('click', 'a', function(event) { 
    window._link_was_clicked = true; 
}); 

एक (बहुत) गरीब आदमी का jQuery के सुविधाजनक प्रतिनिधिमंडल से निपटने के बिना कार्यान्वयन दिखाई दे सकता है जैसे:

document.addEventListener("click", function(event) { 
    if (this.nodeName.toLowerCase() === 'a') { 
    window._link_was_clicked = true; 
    } 
}, true); 

इस सभी लिंक पर अनुमति देता है beforeunload हैंडलर का आविष्कार किए बिना आपका पृष्ठ छोड़ने के लिए। मुझे यकीन है कि आप इसे अनुकूलित करने के तरीके को समझ सकते हैं, क्या आप केवल लिंक के विशिष्ट सेट के लिए इसे अनुमति देना चाहते हैं (आपका प्रश्न उस पर विशेष रूप से स्पष्ट नहीं था)।

+0

इस उत्तर के लिए बहुत धन्यवाद है। मैं jQuery के बिना इसका उपयोग करने की कोशिश कर रहा हूं - और मैं यह समझने की कोशिश कर रहा हूं कि poormans कार्यान्वयन को कैसे एकीकृत किया जाए, लेकिन इसे समझने के लिए प्रतीत नहीं होता है (मुझे माफ़ कर दो, मैं एक जेएस newb का थोड़ा सा हूँ)। – mirin

+0

आपका कोड अर्ध-दाएं था। मैंने पूरे जवाब के साथ सवाल का जवाब दिया है। – mirin

+0

अगर किसी को आईई में काम करने में समस्या हो रही है तो मुझे शून्य की बजाय अपरिभाषित करना पड़ा। यानी क्रोम दोनों में काम करता है। – Janspeed

3
var link_was_clicked = false; 
document.addEventListener("click", function(e) { 
    if (e.target.nodeName.toLowerCase() === 'a') { 
    link_was_clicked = true; 
    } 
}, true); 

window.onbeforeunload = function() { 
    if(link_was_clicked) { 
    link_was_clicked = false; 
    return; 
    } 
    //other code here 
} 
1

आपके पास टाइमर का उपयोग करके एक link unload या एक reload/user entering a different address unload रों के बीच भिन्न हो सकते हैं। इस तरह से आप जानते हैं कि beforeunload लिंक क्लिक के बाद सीधे ट्रिगर किया गया था।

jQuery का उपयोग कर उदाहरण:

$('a').on('click', function(){ 
    window.last_clicked_time = new Date().getTime(); 
    window.last_clicked = $(this); 
}); 

$(window).bind('beforeunload', function() { 
    var time_now = new Date().getTime(); 
    var link_clicked = window.last_clicked != undefined; 
    var within_click_offset = (time_now - window.last_clicked_time) < 100; 

    if (link_clicked && within_click_offset) { 
    return 'You clicked a link to '+window.last_clicked[0].href+'!'; 
    } else { 
    return 'You are leaving or reloading the page!'; 
    } 
}); 

(क्रोम में परीक्षण)

संबंधित मुद्दे

 संबंधित मुद्दे