ब्राउज़र विंडो क्लोज इवेंट को कैसे कैप्चर करें?


149

मैं ब्राउज़र विंडो / टैब क्लोज इवेंट को कैप्चर करना चाहता हूं। मैंने jQuery के साथ निम्नलिखित कोशिश की है:

jQuery(window).bind(
    "beforeunload", 
    function() { 
        return confirm("Do you really want to close?") 
    }
)

लेकिन यह फॉर्म सबमिट करने पर भी काम करता है, जो कि मुझे नहीं चाहिए। मैं एक ऐसी घटना चाहता हूं जो केवल तभी चालू हो जब उपयोगकर्ता विंडो बंद कर दे।

जवाबों:


212

beforeunloadजब भी उपयोगकर्ता किसी कारण से आपका पृष्ठ छोड़ता है, तो यह घटना आग हो जाती है।

उदाहरण के लिए, यह निकाल दिया जाएगा यदि उपयोगकर्ता एक फॉर्म सबमिट करता है, एक लिंक पर क्लिक करता है, विंडो (या टैब) को बंद करता है, या पता बार, खोज बॉक्स, या बुकमार्क का उपयोग करके एक नए पृष्ठ पर जाता है।

आप निम्न कोड के साथ फॉर्म सबमिशन और हाइपरलिंक (अन्य फ्रेम को छोड़कर) को बाहर कर सकते हैं:

var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

1.7 से अधिक पुराने jQuery के संस्करणों के लिए, यह प्रयास करें:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

liveविधि के साथ नहीं काम करता है submit, इसलिए यदि आप एक नया रूप जोड़ने के लिए, आप इसे भी करने के लिए हैंडलर बाध्य करने के लिए की आवश्यकता होगी घटना,।

ध्यान दें कि यदि कोई भिन्न ईवेंट हैंडलर सबमिट या नेविगेशन को रद्द करता है, तो आप पुष्टि प्रॉम्प्ट खो देंगे यदि विंडो वास्तव में बाद में बंद हो जाती है। आप उस समय submitऔर clickघटनाओं को रिकॉर्ड करके और beforeunloadबाद में कुछ सेकंड से अधिक होने पर जाँच कर सकते हैं।


8
हाँ, महान काम! Jquery के नए संस्करण $ ('फ़ॉर्म') का समर्थन करते हैं। लाइव ('सबमिट, फ़ंक्शन () {})।
वेंकट डी।

4
आपका समाधान अच्छा है लेकिन मैं रीफ़्रेश होने की स्थिति में घटना को कैसे रद्द करूँ? मुझे इवेंट तभी चाहिए जब ब्राउजर बंद हो, रिफ्रेश का कोई मामला न हो
Refael

ऐसा लगता है कि ब्राउज़र पुष्टिकरण संवाद के रूप में पहले से लोड का रिटर्न मान प्रदर्शित करता है। इसलिए मुझे लगता है कि यह उत्तर अधिक सटीक है: लिंक
तहघा

2
का उपयोग कर एक पृष्ठ के इस संभाल ताज़ा करता है Ctrl + r, F5, Ctrl + Shift + rऔर ब्राउज़र URL में बदलाव?
आरती

1
@ जॉनी: अब बस है .on()
SLaks

45

हो सकता है कि beforeunloadइवेंट के हैंडलर के इवेंट हैंडलर को अनबाइंड करें submit:

jQuery('form').submit(function() {
    jQuery(window).unbind("beforeunload");
    ...
});

3
क्या यह सिर्फ इतना आसान नहीं है कि इसे फॉर्म टैग की परिभाषा में निर्दिष्ट करके jQuery का उपयोग न करें? : `<फॉर्म ऑनसुबमिट =" window.onbeforeunload = null; ">
awe

4
@awe लेकिन आपको इसे onsubmit=...प्रत्येक रूप में शामिल करना होगा। (मेरे पास एक निश्चित
वेबएप

16

क्रॉस-ब्राउज़र समाधान (Chrome 21, IE9, FF15 में परीक्षण किया गया) के लिए, निम्नलिखित कोड का उपयोग करने पर विचार करें, जो कि स्लैक्स कोड का थोड़ा ट्वीक संस्करण है:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
}); 

ध्यान दें कि फ़ायरफ़ॉक्स 4 के बाद से, "क्या आप वास्तव में बंद करना चाहते हैं?" प्रदर्शित नहीं किया जाता है। एफएफ सिर्फ एक सामान्य संदेश प्रदर्शित करता है। नोट देखें https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload


3
यह एक ब्राउज़र में लगातार काम करता है। बस एक त्वरित नोट; मैंने liveऔर bindस्टेटमेंट दोनों को अपडेट किया on, जो jQuery के नवीनतम स्तर के साथ बहुत अच्छा काम करता है। धन्यवाद!
सेबलफॉस्ट


4

एक ऐसे समाधान के लिए, जो तेलरिक (तृतीय: रेडकॉमबॉक्स) और देवएक्सप्रेस जैसे तीसरे पक्ष के नियंत्रणों के साथ अच्छी तरह से काम करता है, जो विभिन्न कारणों के लिए एंकर टैग का उपयोग करते हैं, निम्नलिखित कोड का उपयोग करने पर विचार करते हैं, जो स्वयं के लिए बेहतर चयनकर्ता के साथ डेसम के कोड का थोड़ा ट्वीक संस्करण है। एंकर टैग को लक्षित करना:

var inFormOrLink;
$('a[href]:not([target]), a[href][target=_self]').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
});

1
यह उत्तर सही है लेकिन उन लोगों के लिए जिनके पास इस ईवेंट के साथ समस्याएँ हैं, जब आप ब्राउज़र को रीफ़्रेश करते हैं, तो आपके कोड को निम्न कोड में बदल देते हैं: यदि (inFormOrLink! == अपरिभाषित &&! InFormOrLink)
लियोन पियर

4

मेरा जवाब सरल बेंचमार्क प्रदान करना है।

कैसे

@SLaks उत्तर देखें ।

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

ब्राउज़र को आपके पेज को बंद करने में कितना समय लगता है?

जब भी कोई उपयोगकर्ता पृष्ठ ( xबटन या CTRL+ W) को बंद करता है, तो ब्राउज़र दिए गए beforeunloadकोड को निष्पादित करता है , लेकिन अनिश्चित काल तक नहीं। एकमात्र अपवाद पुष्टिकरण बॉक्स ( return 'Do you really want to close?) है जो उपयोगकर्ता की प्रतिक्रिया तक इंतजार करेगा।

क्रोम : 2 सेकंड।
फ़ायरफ़ॉक्स : close (या डबल क्लिक करें, या पास पर बल)
एज : or (या डबल क्लिक)
एक्सप्लोरर 11 : 0 सेकंड।
सफ़ारी : TODO

हम इसका क्या परीक्षण करते थे:

  • अनुरोध लॉग के साथ एक Node.js एक्सप्रेस सर्वर
  • निम्न लघु HTML फ़ाइल

ब्राउज़र द्वारा अपना पेज बंद करने से पहले (सिंक्रोनाइज़) करने से पहले जितने अनुरोध करने हैं उतने ही भेजना है।

<html>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
    function request() {
        return $.ajax({
            type: "GET",
            url: "http://localhost:3030/" + Date.now(),
            async: true
        }).responseText;
    }
    window.onbeforeunload = () => {
        while (true) {
            request();
        }
        return null;
    }
    </script>
</body>
</html>

क्रोम आउटपुट:

GET /1480451321041 404 0.389 ms - 32  
GET /1480451321052 404 0.219 ms - 32  
...  
GET /hello/1480451322998 404 0.328 ms - 32

1957ms  2 seconds // we assume it's 2 seconds since requests can take few milliseconds to be sent.

3

मैंने स्लैक्स के उत्तर का उपयोग किया, लेकिन यह उस तरह से काम नहीं कर रहा था, जब से onbeforeunload returnValue को स्ट्रिंग के रूप में पार्स किया गया और फिर ब्राउज़र के पुष्टिकरण बॉक्स में प्रदर्शित किया गया। तो मूल्य सच प्रदर्शित किया गया था, जैसे "सच"।

बस रिटर्न का उपयोग करके काम किया। यहाँ मेरा कोड है

var preventUnloadPrompt;
var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
//var redirectAfterPrompt = "http://www.google.co.in";
$('a').live('click', function() { preventUnloadPrompt = true; });
$('form').live('submit', function() { preventUnloadPrompt = true; });
$(window).bind("beforeunload", function(e) { 
    var rval;
    if(preventUnloadPrompt) {
        return;
    } else {
        //location.replace(redirectAfterPrompt);
        return messageBeforeUnload;
    }
    return rval;
})

1

शायद आप OnSubmit को संभाल सकते हैं और एक ध्वज सेट कर सकते हैं जिसे आप बाद में अपने OnBeforeUnload हैंडलर में चेक करते हैं।


1
jQuery(window).bind(
                    "beforeunload",
                      function (e) {
                          var activeElementTagName = e.target.activeElement.tagName;
                          if (activeElementTagName != "A" && activeElementTagName != "INPUT") {
                              return "Do you really want to close?";
                          }
                      })

1

दुर्भाग्य से, चाहे वह पुनः लोड हो, नया पृष्ठ पुनर्निर्देशित हो, या ब्राउज़र बंद हो घटना को ट्रिगर किया जाएगा। एक विकल्प ईवेंट को ट्रिगर करने वाले आईडी को पकड़ता है और यदि यह फ़ॉर्म है तो किसी फ़ंक्शन को ट्रिगर न करें और यदि यह फॉर्म का आईडी नहीं है, तो पृष्ठ बंद होने पर आप क्या करना चाहते हैं। मुझे यकीन नहीं है कि अगर यह सीधे भी संभव है और थकाऊ है।

ग्राहक टैब बंद करने से पहले आप कुछ छोटे काम कर सकते हैं। जावास्क्रिप्ट ब्राउज़र पास टैब / बंद ब्राउज़र का पता लगाने , लेकिन अगर कार्रवाई की अपनी सूची बड़ा कर रहे हैं और यह पहले टैब बंद समाप्त हो गया है आप असहाय हैं। आप इसे आज़मा सकते हैं लेकिन मेरे अनुभव के साथ यह निर्भर नहीं करता है।

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";
  /* Do you small action code here */
  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload


0

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


0

मेरा मुद्दा: अगर 'सबमिशन (क्लिक) की विषम संख्या होती तो' ऑनबीफ्रोन्लोड 'इवेंट चालू हो जाता। मैं अपने समाधान काम करने के लिए एसओ में इसी तरह के धागे से समाधान का एक संयोजन था। अच्छा मेरा कोड बोलेगा

<!--The definition of event and initializing the trigger flag--->


$(document).ready(function() {
updatefgallowPrompt(true);
window.onbeforeunload = WarnUser;   
}

function WarnUser() {
var allowPrompt = getfgallowPrompt();
    if(allowPrompt) {
    saveIndexedDataAlert();
    return null;
    } else {
        updatefgallowPrompt(true);
        event.stopPropagation
    }
}

<!--The method responsible for deciding weather the unload event is triggered from submit or not--->
function saveIndexedDataAlert() {
    var allowPrompt = getfgallowPrompt();
    var lenIndexedDocs = parseInt($('#sortable3 > li').size()) + parseInt($('#sortable3 > ul').size());

    if(allowPrompt && $.trim(lenIndexedDocs) > 0) {
        event.returnValue = "Your message";
    } else {
        event.returnValue = "   ";
        updatefgallowPrompt(true);
    }
}

<!---Function responsible to reset the trigger flag---->
$(document).click(function(event) {  
$('a').live('click', function() { updatefgallowPrompt(false); });
 });

<!--getter and setter for the flag---->
function updatefgallowPrompt (allowPrompt){ //exit msg dfds
    $('body').data('allowPrompt', allowPrompt); 
}   

function getfgallowPrompt(){        
    return $('body').data('allowPrompt');   
}

0

JQuery 1.7 के रूप में, .live () विधि पदावनत है। ईवेंट हैंडलर संलग्न करने के लिए .on () का उपयोग करें। JQuery के पुराने संस्करणों के उपयोगकर्ताओं को .live () के लिए .delegate () का उपयोग करना चाहिए

$(window).bind("beforeunload", function() {
    return true || confirm("Do you really want to close?"); 
}); 

पूर्ण या लिंक पर

$(window).unbind();

0

यह भी कोशिश करो

window.onbeforeunload = function ()
{       
    if (pasteEditorChange) {
        var btn = confirm('Do You Want to Save the Changess?');
           if(btn === true ){
               SavetoEdit();//your function call
           }
           else{
                windowClose();//your function call
           }
    }  else { 
        windowClose();//your function call
    }
};

-1

बस सत्यापित करें ...

function wopen_close(){
  var w = window.open($url, '_blank', 'width=600, height=400, scrollbars=no, status=no, resizable=no, screenx=0, screeny=0');
  w.onunload = function(){
    if (window.closed) {
       alert("window closed");
    }else{ 
       alert("just refreshed");
    }
  }
}

यह काम नहीं करता है। फिलहाल अनलोड घटना आग (btw, यह दस्तावेज़ से आग), window.closed === झूठी;
सर्गेई पी। उर्फ ​​अज्यूर 11

-1
var validNavigation = false;
            jQuery(document).ready(function () {

                wireUpEvents();
            });

            function endSession() {
                // Browser or broswer tab is closed
                // Do sth here ...
                alert("bye");
            }

            function wireUpEvents() {
                /*
                * For a list of events that triggers onbeforeunload on IE
                * check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
                */
                window.onbeforeunload = function () {
                    debugger
                    if (!validNavigation) {
                        endSession();
                    }
                }

                // Attach the event keypress to exclude the F5 refresh
                $(document).bind('keypress', function (e) {
                    debugger
                    if (e.keyCode == 116) {
                        validNavigation = true;
                    }
                });

                // Attach the event click for all links in the page
                $("a").bind("click", function () {
                    debugger
                    validNavigation = true;
                });

                // Attach the event submit for all forms in the page
                $("form").bind("submit", function () {
                    debugger
                    validNavigation = true;
                });

                // Attach the event click for all inputs in the page
                $("input[type=submit]").bind("click", function () {
                    debugger
                    validNavigation = true;
                });

            }`enter code here`

-7

मेरे लिए काम करने के बाद;

 $(window).unload(function(event) {
    if(event.clientY < 0) {
        //do whatever you want when closing the window..
    }
 });

यह एक jquery फ़ंक्शन है।
मैक्सिमम

7
event.clientYयदि आप ब्राउज़र बंद करें बटन या टैब बंद करें बटन पर क्लिक करें नकारात्मक है। हालाँकि, यह मान सकारात्मक है जब आप कीबोर्ड शॉर्टकट (F5, Ctrl-R) का उपयोग करके पृष्ठ को फिर से लोड करते हैं या कीबोर्ड शॉर्टकट (जैसे Alt-F4) का उपयोग करके ब्राउज़र को बंद करते हैं। इस प्रकार, आप इवेंट स्थिति को पृष्ठ पुनः लोड करने वाली घटना से ब्राउज़र क्लोज़ इवेंट को अलग करने के लिए भरोसा नहीं कर सकते।
जुलिएन क्रोनग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.