ब्राउजर या टैब क्लोजिंग का पता लगाएं


306

क्या यह पता लगाने के लिए कोई क्रॉस-ब्राउज़र जावास्क्रिप्ट / jQuery कोड है कि ब्राउज़र या ब्राउज़र टैब बंद किया जा रहा है, लेकिन लिंक पर क्लिक किए जाने के कारण नहीं?


1
इस सवाल का मेरा जवाब देखें: stackoverflow.com/questions/3735198/…
Nivas

आप ऐसा कर सकते हैं! stackoverflow.com/questions/42706209/…
एपी।

sessionStorage प्रॉपर्टी का उपयोग करें , ब्राउज़र बंद होते ही यह समाप्त हो जाएगा। w3schools.com/jsref/prop_win_sessionstorage.asp
csandreas1

इस उत्तर की जाँच करें! मैंने इसे बहुत उपयोगी पाया और अधिकांश मामलों को कवर किया। stackoverflow.com/a/26275621/7192927
सुकन्यापाय

जवाबों:


273

यदि मैं आपको सही ढंग से प्राप्त करता हूं, तो आप जानना चाहते हैं कि टैब / विंडो प्रभावी रूप से कब बंद है। खैर, AFAIK एकमात्र तरीका है Javascriptजिससे यह पता लगाया जा सकता है कि सामान किस प्रकार के हैं onunloadऔर onbeforeunloadघटनाएँ हैं।

दुर्भाग्य से (या सौभाग्य से?), उन घटनाओं को भी निकाल दिया जाता है जब आप किसी साइट को linkअपने या अपने ब्राउज़र के बैक बटन पर छोड़ देते हैं । तो यह सबसे अच्छा जवाब है जो मैं दे सकता हूं, मुझे नहीं लगता कि आप मूल रूप closeसे जावास्क्रिप्ट में एक शुद्ध का पता लगा सकते हैं । अगर मैं यहां गलत हूं तो मुझे सुधारो।


39
सही बात। आप केवल तभी पता लगा सकते हैं जब पृष्ठ अनलोड किया गया हो, न कि जब खिड़की बंद हो। इसके अलावा, onbeforeunload गैर-मानक है, इसलिए यह सभी ब्राउज़रों द्वारा समर्थित नहीं है।
गुफ़ा

7
मैं 'ऑन क्लोज' फीचर का भी उपयोग करना चाहता था, लेकिन ध्यान दिया कि मेरे उपयोगकर्ता कभी-कभार F5 दबाकर स्क्रीन को रीफ्रेश करेंगे। चूँकि मेरे 'ऑन ऑफ़ क्लोज' हैंडलर्स को ऐसे रिफ्रेश पर लाया जाता है, इसका मतलब है कि मैं इसका इस्तेमाल उस तरह से नहीं कर सकता जिस तरह से मुझे इसकी ज़रूरत थी (जो कि एक सच्चा 'क्लोज़ टैब या विंडो' था) ... लानत है, हमें एक नए इवेंट मॉडल की ज़रूरत है इस सब के लिए!
17

1
अब क्रोम / ओपेरा पर काम नहीं करता ... chromestatus.com/feature/5349061406228480
समीर सीतल

2
बेशक यह अभी भी काम करेगा, उन्होंने सिर्फ एक कस्टम Stringरिटर्न वैल्यू को हटा दिया onbeforeunload। इसलिए अब आप अनलोड करने से पहले कस्टम संदेश प्रदर्शित नहीं कर पाएंगे।
जॉन्डी

@jAndy @Guffa मैं कैसे पता लगा सकता हूं कि किस विंडो को निकाल दिया गया unload?
Egor Dudyak

125

से फ़ायरफ़ॉक्स प्रलेखन

कुछ कारणों से, वेबकिट-आधारित ब्राउज़र संवाद बॉक्स के लिए युक्ति का पालन नहीं करते हैं। लगभग क्रॉस-वर्किंग उदाहरण नीचे के उदाहरण से करीब होगा।

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";

  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

यह उदाहरण सभी ब्राउज़रों को संभालने के लिए है।


2
यह एकमात्र समाधान है जिसने मेरे क्रोम ब्राउज़र के लिए काम किया है। मैंने किसी अन्य की कोशिश नहीं की।
चेस रॉबर्ट्स

4
हाँ, मैं बहुत सारे समाधानों की कोशिश करता हूं और मैं अंत में इसके साथ आता हूं, सर्वश्रेष्ठ उत्तरों के लिए संयोजन, और मैं इसे सभी ब्राउज़रों पर परीक्षण करता हूं।
मोहम्मद-इब्राहिम

1
केवल टैब खोले जाने के साथ फ़ायरफ़ॉक्स (> = ४४) का उपयोग करते हुए यह विधि टैब क्लोज़ पर पूरी तरह से काम नहीं कर रही है।
राजकिशोर

आज तक, ब्राउज़र के सभी नवीनतम संस्करणों का उपयोग करते हुए, टैब बंद करते समय शीघ्र काम करता है, क्रोम, फ़ायरफ़ॉक्स, ओपेरा, IE11 और एज के लिए ब्राउज़र को दूर करने या बंद करने पर काम करता है और यह भी काम करता है जब आपके पास क्रोम को छोड़कर सभी टैब खुल जाते हैं जहां क्रोम सभी टैब बंद कर देता है। बिना संकेत दिए, कम से कम मेरी मशीन पर।
थियरी

सवाल में परिभाषित के रूप में एक उचित बाहर नहीं दे रहा है। यह पेज लीव इवेंट पर न केवल ब्राउजर क्लोज या टैब क्लोज होता है
सुनील आचार्य

48

सरल उपाय

window.onbeforeunload = function () {
    return "Do you really want to close?";
};

7
यह किस तरह की जादूगरी है? (y) यह सभी ब्राउज़रों पर काम करता है? क्रोम पर बहुत अच्छा काम करता है
Ziv Weissman

5
जब आप पृष्ठ को ताज़ा करते हैं तो यह आग हो जाती है। यही मेरी एकमात्र समस्या है।
सिंह लियोनसियो

6
यह समाधान फ़ायरफ़ॉक्स और क्रोम पर नहीं है
मेहदी देहनागी

यह पेज लीव इवेंट पर न केवल ब्राउजर क्लोज या टैब क्लोज होता है
सुनील आचार्य

20
<body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">

var myclose = false;

function ConfirmClose()
{
    if (event.clientY < 0)
    {
        event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
        setTimeout('myclose=false',10);
        myclose=true;
    }
}

function HandleOnClose()
{
    if (myclose==true) 
    {
        //the url of your logout page which invalidate session on logout 
        location.replace('/contextpath/j_spring_security_logout') ;
    }   
}

// यह IE7 में काम कर रहा है, यदि आप केवल एक टैब के साथ टैब या ब्राउज़र बंद कर रहे हैं


2
फिर। लेकिन जैसे कई टैब ब्राउज़र के लिए ie8, फ़ायरफ़ॉक्स। इसका उपयोग करने में समस्या है?
कॉमेटा

यह पता चला है कि IE9 में इस कोड का उपयोग करने पर यह संदेश पॉप अप हो जाएगा जब उपयोगकर्ता अपने माउस के साथ पीछे, आगे या ताज़ा बटन पर क्लिक करेगा।
स्टीव वॉर्थम

बस एक सिर है कि हम 2007 में एक समान समाधान वापस लागू किया। यह समाधान अब IE9 में लगभग एक सप्ताह पहले काम नहीं करता है। इसने बहुत पहले ही टैब किए गए ब्राउज़रों में काम करना बंद कर दिया था (या संभवतः कभी काम नहीं किया था)।
tjfo

मैंने क्रोमियम / उबंटू में कंसोल को इंजेक्ट किया window.onunload = "alert('wait')"और window.onbeforeunload = "alert('wait... chrome!')"उपयोग किया लेकिन जब मैंने टैब बंद किया तो न तो निकाल दिया गया।
इकावाटर

window.onunload = "alert('wait')"और इस तरह वास्तव में काम नहीं करना चाहिए। "फ़ंक्शन को ईवेंट ऑब्जेक्ट की रिटर्न वेल्यू प्रॉपर्टी के लिए एक स्ट्रिंग मान असाइन करना चाहिए और उसी स्ट्रिंग को वापस करना चाहिए"। कृपया
एमडीएन

8

ब्राउज़र या टैब बंद होने पर मुझे उपयोगकर्ता को स्वचालित रूप से लॉग आउट करने की आवश्यकता होती है, लेकिन तब नहीं जब उपयोगकर्ता अन्य लिंक पर नेविगेट करता है। मैं यह भी नहीं चाहता था कि ऐसा होने पर एक पुष्टिकरण संकेत दिखाया जाए। कुछ समय के लिए इसके साथ संघर्ष करने के बाद, विशेष रूप से IE और एज के साथ, यहां इस जवाब से दृष्टिकोण को आधार बनाने के बाद मैंने क्या किया (IE 11, एज, क्रोम, और फ़ायरफ़ॉक्स के साथ काम करना) ।

सबसे पहले, beforeunloadजेएस में इवेंट हैंडलर में सर्वर पर एक उलटी गिनती घड़ी शुरू करें । अजाक्स कॉल को IE और एज के ठीक से काम करने के लिए समकालिक होना चाहिए। आपको return;पुष्टि डायलॉग को इस तरह दिखाने से रोकने के लिए भी उपयोग करना होगा:

    window.addEventListener("beforeunload", function (e) {        
      $.ajax({
          type: "POST",
          url: startTimerUrl,
          async: false           
      });
      return;
    });

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

कार्यान्वयन नोट: मैं ASP.NET MVC 5 का उपयोग कर रहा हूं और एक ओवरराइड Controller.OnActionExecuted()विधि में लॉगआउट रद्द कर रहा हूं ।


यह बहुत अच्छा काम किया। क्या कोई कारण है जो आप "async: false" बनाते हैं? यह चेतावनी देता है कि तुल्यकालिक AJAX कॉल को हटा दिया गया है। धन्यवाद!
cat_in_hat

1
@FoundWaldoException, जैसा कि उत्तर में दिया गया है, मैंने पाया कि IE और Edge में काम करने के लिए async को झूठे सेट करने की आवश्यकता है।
Ionian316

लॉगआउट को कैसे रद्द किया जाए OnActionExecuted?
किकेनेट

@Kiquenet उस टाइमर को बंद करें जो आपके कोड में शुरू किया गया था।
आइऑन 316

6

क्षमा करें, मैं मौजूदा उत्तरों में से एक में एक टिप्पणी जोड़ने में सक्षम नहीं था, लेकिन यदि आप एक प्रकार का चेतावनी संवाद लागू करना चाहते थे, तो मैं केवल यह उल्लेख करना चाहता था कि किसी भी घटना हैंडलर फ़ंक्शन का एक तर्क है - घटना। अपने मामले में आप अपने आप पृष्ठ छोड़ने के लिए घटना को रद्द कर सकते हैं। मैं इसे मानक बदसूरत और असुरक्षित चेतावनी () का उपयोग करने से बेहतर विकल्प मानता हूं। मैंने व्यक्तिगत रूप से kendoWindow ऑब्जेक्ट (Telerik's Kendo UI के आधार पर संवाद बॉक्स का अपना सेट लागू किया है, जो लगभग पूरी तरह से खुला-खुला है, सिवाय kendoGrid और kendoEditor के)। आप jQuery UI से डायलॉग बॉक्स का भी उपयोग कर सकते हैं। कृपया ध्यान दें, कि इस तरह की चीजें अतुल्यकालिक हैं, और आपको हर बटन की घटना पर क्लिक करने के लिए एक हैंडलर को बांधना होगा, लेकिन यह सब लागू करना काफी आसान है।

हालाँकि, मैं इस बात से सहमत हूँ कि वास्तविक करीबी घटना की कमी भयानक है: यदि आप, उदाहरण के लिए, अपने सत्र की स्थिति को केवल वास्तविक बंद होने की स्थिति में बैक-एंड पर रीसेट करना चाहते हैं, तो यह एक समस्या है।


6

समान कार्यों के लिए, आप उपयोग कर सकते हैं sessionStorage ब्राउज़र टैब बंद होने तक स्थानीय रूप से डेटा स्टोर लिए ।

sessionStorageकेवल एक सत्र (ब्राउज़र टैब बंद कर दिया है डेटा को हटा दिया जाता है) के लिए वस्तु भंडार डेटा। ( W3Schools )

यह मेरी कलम है

<div id="Notice">
    <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
    $("#Notice").click(function() {
     //set sessionStorage on click
        sessionStorage.setItem("dismissNotice", "Hello");
        $("#Notice").remove();
    });
    if (sessionStorage.getItem("dismissNotice"))
    //When sessionStorage is set Do stuff...
        $("#Notice").remove();
</script>

5

कोई घटना नहीं है, लेकिन एक संपत्ति है window.closedजो इस लेखन के समय तक सभी प्रमुख ब्राउज़रों में समर्थित है। इस प्रकार यदि आपको वास्तव में यह जानने की आवश्यकता है कि आप उस संपत्ति की जांच करने के लिए विंडो को पोल कर सकते हैं।

if(myWindow.closed){do things}

नोट: किसी भी चीज को मतदान करना आमतौर पर सबसे अच्छा समाधान नहीं है। window.onbeforeunloadयदि संभव हो तो इस घटना का उपयोग किया जाना चाहिए, एकमात्र चेतावनी यह है कि यदि आप दूर जाते हैं तो यह भी आग लगाता है।


4
$(window).unload( function () { alert("Bye now!"); } );

9
यह फ़ायरफ़ॉक्स या क्रोम पर काम नहीं करेगा। beforeunloadयदि कोई अलर्ट प्रदर्शित करना चाहता है तो प्रयास करें । इस तरह:$(window).on('beforeunload', function(){ alert ('Bye now')});
AdrianoRR

5
jQuery डॉक्स के अनुसार "अधिकांश ब्राउज़र अलर्ट (), पुष्टिकरण () और प्रॉम्प्ट ()"
एपि.जेकरी.com

4

इसका उपयोग करने का प्रयास करें:

window.onbeforeunload = function (event) {
    var message = 'Important: Please click on \'Save\' button to leave this page.';
    if (typeof event == 'undefined') {
        event = window.event;
    }
    if (event) {
        event.returnValue = message;
    }
    return message;
};

$(function () {
    $("a").not('#lnkLogOut').click(function () {
        window.onbeforeunload = null;
    });
    $(".btn").click(function () {
        window.onbeforeunload = null;
});
});

3

मुझे एक रास्ता मिला, जो मेरे सभी ब्राउज़रों पर काम करता है

निम्नलिखित संस्करणों पर परीक्षण किया गया: फ़ायरफ़ॉक्स 57, इंटरनेट एक्सप्लोरर 11, एज 41, नवीनतम क्रोम में से एक (यह मेरा संस्करण नहीं दिखाएगा)

नोट : onbeforeunload अगर आप किसी भी तरह से पेज को छोड़ते हैं (ताज़ा, नज़दीकी ब्राउज़र, रीडायरेक्ट, लिंक, सबमिट ..) को छोड़ दें। यदि आप चाहते हैं कि यह केवल ब्राउज़र क्लोजर पर ही हो, तो केवल ईवेंट हैंडलर को बांधें।

  $(document).ready(function(){         

        var validNavigation = false;

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

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

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

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

        window.onbeforeunload = function() {                
            if (!validNavigation) {     
                // ------->  code comes here
            }
        };

  });

ब्राउज़र क्लोज़ के लिए एक अलग हैंडलर कैसे जोड़ा जाएगा..मुझे नहीं लगता कि हमारे पास इसके लिए अलग घटना है।
ब्लेज़हब

यह बहुत मददगार था। मुझे वास्तविक हाइपरलिंक्स के लिए केवल एंकर को समायोजित करने की आवश्यकता थी। अन्यथा बूटस्ट्रैप टैब पर क्लिक करने से यह गड़बड़ हो गया: $ ("a [href! = '']"। नहीं ('[href ^ = "#"])। बाँध ("क्लिक", फंक्शन) ()
केन फ़ेसलंड

3

चूंकि किसी ने अभी तक इसका उल्लेख नहीं किया है (8+ साल बाद): एक वेबसकेट बंद टैब का पता लगाने का एक और प्रभावी तरीका हो सकता है। जब तक टैब खुला है और होस्ट पर बताया गया है, क्लाइंट होस्ट के लिए एक सक्रिय WebSocket कनेक्शन बनाए रखने में सक्षम है।

कैविएट: कृपया ध्यान दें कि यह समाधान वास्तव में केवल एक परियोजना के लिए व्यवहार्य है अगर एक वेबसकेट को आप जो पहले से कर रहे हैं उससे किसी भी अतिरिक्त महत्वपूर्ण ओवरहेड की आवश्यकता नहीं है।

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

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


2
यह ठीक है। लेकिन, क्या आप इसे संभालने के लिए कोई कोड या प्रक्रिया साझा नहीं कर सकते? उसके बिना मेरे जैसे एक महान व्यक्ति के लिए समझ में नहीं आता
पी सतीश पात्रो

दरअसल, मैं अपनी पहली टिप्पणी में स्पष्ट नहीं था। मुझे वेब सॉकेट नहीं पता है। इसलिए, मैं सिर्फ यह देखना चाहता था कि कैसे
संभालूं

1
ऊपर मेरी टिप्पणी में लिंक कुछ उदाहरण के लिए जाता है WebSocket JS कोड। क्लाइंट JS हिस्सा आसान हिस्सा है। यह कोड मेरे बहुत विशिष्ट उपयोग-मामले के लिए है, हालांकि मुझे समय पर पूरे एप्लिकेशन सर्वर को समाप्त करने की आवश्यकता है। आप एक WebSocket सर्वर कैसे लिखते हैं यह आपके ऊपर है और सब कुछ जोड़ने के लिए सर्वर-साइड कॉन्फ़िगरेशन की आवश्यकता होती है (बहुत से लोग NodeJS बैकएंड w / Nginx फ्रंटेंड को पसंद करते हैं)। टीसीपी / आईपी सक्षम सर्वर लिखना एक जटिल विषय है जो टिप्पणियों में चर्चा के लिए उपयुक्त नहीं है और यह इस विशेष मुद्दे का पता लगाने के लिए एक सेट करने के लिए ओवरकिल है।
CubicleSoft

2
//Detect Browser or Tab Close Events
$(window).on('beforeunload',function(e) {
  e = e || window.event;
  var localStorageTime = localStorage.getItem('storagetime')
  if(localStorageTime!=null && localStorageTime!=undefined){
    var currentTime = new Date().getTime(),
        timeDifference = currentTime - localStorageTime;

    if(timeDifference<25){//Browser Closed
       localStorage.removeItem('storagetime');
    }else{//Browser Tab Closed
       localStorage.setItem('storagetime',new Date().getTime());
    }

  }else{
    localStorage.setItem('storagetime',new Date().getTime());
  }
});

JSFiddle लिंक

हाय सब, मैं ब्राउज़र स्थानीय भंडारण और टाइमस्टैम्प का उपयोग करके 'डिटेक्ट ब्राउज़र और टैब क्लोज इवेंट' क्लिक प्राप्त करने में सक्षम था। आशा है आप सभी इस समाधान का उपयोग करके अपनी समस्याओं को हल करेंगे।

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

मैंने इसे क्रोम ब्राउज़र संस्करण 76.0.3809.132 पर परीक्षण किया और काम करते पाया

:) वोट करें अगर आपको मेरा उत्तर मददगार लगा तो…।


खैर, इसने मुझे एक विचार दिया। मैं लॉगिन के बाद और घटना से पहले लोड करने के बाद लोकलस्टोरेज में टाइमस्टैम्प प्लस 10 सेकंड सेट कर रहा हूं। लोड होने पर मैं सत्यापित करता हूं कि यदि समय बीत गया, तो लॉगिन पृष्ठ पर पुनः निर्देशित करें। धन्यवाद :)
G4BB3R

1
window.onbeforeunload = function() {
  console.log('event');
  return false; //here also can be string, that will be shown to the user
}

2
here also can be string, that will be shown to the userयह फ़ायरफ़ॉक्स पर नहीं है, लेकिन यह क्रोम में करता है ...
ट्रायस्पेस

किसी भी रिटर्न वैल्यू (स्ट्रिंग) को केवल MSIE <= 11. में प्रदर्शित किया जाता है, इसलिए मूल रूप से अन्य सभी ब्राउज़रों के लिए बेकार है।
OSWorX

1

इस तरह से 'अनलोड' घटना पर एक ईवेंट हैंडलर में window.closed की मदद से इसे जांचना संभव है, लेकिन टाइमआउट उपयोग की आवश्यकता है (इसलिए परिणाम की गारंटी नहीं दी जा सकती है, तो देरी होने पर या विंडो को बंद होने से रोकें)

JSField (lates Safari, FF, Chrome, Edge और IE11 पर परीक्षण) का उदाहरण

var win = window.open('', '', 'width=200,height=50,left=200,top=50');
win.document.write(`<html>
   <head><title>CHILD WINDOW/TAB</title></head>
   <body><h2>CHILD WINDOW/TAB</h2></body>
</html>`);
win.addEventListener('load',() => {
    document.querySelector('.status').innerHTML += '<p>Child was loaded!</p>';
});
win.addEventListener('unload',() => {
    document.querySelector('.status').innerHTML += '<p>Child was unloaded!</p>';
    setTimeout(()=>{
        document.querySelector('.status').innerHTML +=  getChildWindowStatus();
    },1000);
});
win.document.close()
document.querySelector('.check-child-window').onclick = ()=> {
    alert(getChildWindowStatus());
}
function getChildWindowStatus() {
  if (win.closed) { 
      return 'Child window has been closed!';
  } else {
      return 'Child window has not been closed!';
  }
}

1

मैंने उपरोक्त सभी समाधानों की कोशिश की है, उनमें से किसी ने वास्तव में मेरे लिए काम नहीं किया, विशेष रूप से क्योंकि मेरे प्रोजेक्ट में कुछ टेलरिक घटक हैं जिनके पास पॉपअप विंडो के लिए 'क्लोज' बटन है, और यह 'पहले से लोड' इवेंट को कॉल करता है। साथ ही, बटन चयनकर्ता ठीक से काम नहीं करता है जब आपके पेज में टेलरिक ग्रिड होता है (मेरा मतलब ग्रिड के अंदर बटन होता है) इसलिए, मैं उपरोक्त सुझावों में से किसी का भी उपयोग नहीं कर सका। अंत में यह मेरे लिए काम किया समाधान है। मैंने _Layout.cshtml के बॉडी टैग पर एक ऑनऑन लोड इवेंट जोड़ा है। कुछ इस तरह:

<body onUnload="LogOff()">

और फिर खाता / लॉगऑफ़ में रीडायरेक्ट करने के लिए LogOff फ़ंक्शन को जोड़ें जो Asp.Net MVC में एक अंतर्निहित विधि है। अब, जब मैं ब्राउज़र या टैब को बंद करता हूं, तो यह लॉगऑफ़ विधि पर रीडायरेक्ट करता है और उपयोगकर्ता को रिटर्न करते समय लॉगिन करना पड़ता है। मैंने इसे क्रोम और फ़ायरफ़ॉक्स दोनों में परीक्षण किया है। और यह काम करता है!

  function LogOff() {
        $.ajax({
            url: "/Account/LogOff",
            success: function (result) {

                                        }
               });
       }

0
window.onbeforeunload = function ()
{       

    if (isProcess > 0) 
    {
        return true;       
    }   

    else
    { 
        //do something      
    }
}; 

यदि आप ब्राउज़र में किसी भी प्रक्रिया के दौरान विंडो या रिफ्रेश पेज बंद करते हैं, तो यह फ़ंक्शन एक पुष्टिकरण डायलॉग बॉक्स दिखाता है। यह सभी ब्राउज़र में कार्य करता है। आपको अपने ajax प्रक्रिया में isProcess var को सेट करना होगा।


सेट isProcess के लिए पूरा नमूना?
किकेनेट

0
window.addEventListener("beforeunload", function (e) {
 var confirmationMessage = "tab close";

 (e || window.event).returnValue = confirmationMessage;     //Gecko + IE
 sendkeylog(confirmationMessage);
 return confirmationMessage;                                //Webkit, Safari, Chrome etc.
}); 

वास्तव में मैं पुष्टि संदेश दिखाना चाहता था यदि उपयोगकर्ता टैब को बंद करता है तो केवल। यह मेरे लिए काम कर रहा है। लेकिन मुझे एक समस्या का सामना करना पड़ रहा है, अगर मैं उसी पृष्ठ के किसी भी लिंक पर क्लिक कर रहा हूं, तो इसकी पुष्टि संदेश भी दिखाई दे रहा है। इसके लिए संदर्भ देखें: w3schools.com/code/tryit.asp?filename=FEK2KWUN9V8Z @Tunaki
मोहम्मद

1
क्या है sendkeylog?
किकेनेट

0

जैसा कि @jAndy ने उल्लेख किया है, किसी विंडो को बंद करने का पता लगाने के लिए ठीक से जावास्क्रिप्ट कोड नहीं है। मैंने @Syno ने जो प्रस्ताव दिया था, उससे शुरू किया।

मैं हालांकि इस तरह की स्थिति से गुजर चुका था और आपको इन चरणों का पालन करने की अनुमति थी, आप इसका पता लगा सकेंगे।
मैंने इसे क्रोम 67+ और फ़ायरफ़ॉक्स 61+ पर परीक्षण किया।

var wrapper = function () { //ignore this

var closing_window = false;
$(window).on('focus', function () {
    closing_window = false; 
   //if the user interacts with the window, then the window is not being 
   //closed
});

$(window).on('blur', function () {

    closing_window = true;
    if (!document.hidden) { //when the window is being minimized
        closing_window = false;
    }
    $(window).on('resize', function (e) { //when the window is being maximized
        closing_window = false;
    });
    $(window).off('resize'); //avoid multiple listening
});

$('html').on('mouseleave', function () {
    closing_window = true; 
    //if the user is leaving html, we have more reasons to believe that he's 
    //leaving or thinking about closing the window
});

$('html').on('mouseenter', function () {
    closing_window = false; 
    //if the user's mouse its on the page, it means you don't need to logout 
    //them, didn't it?
});

$(document).on('keydown', function (e) {

    if (e.keyCode == 91 || e.keyCode == 18) {
        closing_window = false; //shortcuts for ALT+TAB and Window key
    }

    if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
        closing_window = false; //shortcuts for F5 and CTRL+F5 and CTRL+R
    }
});

// Prevent logout when clicking in a hiperlink
$(document).on("click", "a", function () {
    closing_window = false;
});

// Prevent logout when clicking in a button (if these buttons rediret to some page)
$(document).on("click", "button", function () {
    closing_window = false;

});
// Prevent logout when submiting
$(document).on("submit", "form", function () {
    closing_window = false;
});
// Prevent logout when submiting
$(document).on("click", "input[type=submit]", function () {
    closing_window = false;
});

var toDoWhenClosing = function() {

    //write a code here likes a user logout, example: 
    //$.ajax({
    //    url: '/MyController/MyLogOutAction',
    //    async: false,
    //    data: {

    //    },
    //    error: function () {
    //    },
    //    success: function (data) {
    //    },
    //});
};


window.onbeforeunload = function () {
    if (closing_window) {
        toDoWhenClosing();
    }
};

};


1
आपके जावास्क्रिप्ट कोड में आपके कुछ मुद्दे हैं। पहली बात जिस पर मैंने गौर किया, वह यह है कि resizeखिड़की के धुंधले होने पर आप लगातार उसे बांधेंगे। यदि यह 100x धुंधला हो जाता है, तो आपके पास 100 श्रोता होंगे, जो ब्राउज़र को धीमा कर देगा।
काइल

मैंने एक $ (विंडो) .off ('आकार') डाल दिया, क्या यह पर्याप्त होगा?
ब्रूनो हेनरिक

तकनीकी रूप से, लेकिन यह किसी अन्य हैंडलर को भी हटा देगा जो कि jQuery के माध्यम से कहीं और जोड़ा गया था।
काइल

-2

यह कोशिश करो, मुझे यकीन है कि यह आपके लिए काम करेगा।

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
    $(function() {

        try{
            opera.setOverrideHistoryNavigationMode('compatible');
            history.navigationMode = 'compatible';
        }catch(e){}

        function ReturnMessage()
        {
            return "wait";
        }

        function UnBindWindow()
        {
            $(window).unbind('beforeunload', ReturnMessage);
        }

        $(window).bind('beforeunload',ReturnMessage );
    });
</script>

-3

इसे इस्तेमाल करे। यह काम करेगा। jquery अनलोड विधि को हटा दिया गया है।

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.