पेज को बंद करने (न छोड़ने) से पहले jquery?


83

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

मेरा ग्राहक एक संदेश दिखाना चाहता है जब उपयोगकर्ता पृष्ठ को बंद करने की कोशिश करता है "क्या आप सुनिश्चित हैं कि आप पृष्ठ को छोड़ना चाहते हैं? आपके पास अभी भी आपकी खरीदारी की टोकरी में आइटम हैं।"

$(window).bind('beforeunload')जब उपयोगकर्ता पृष्ठ बंद करता है तो दुर्भाग्य से केवल आग नहीं लगती है।

jQuery:

function checkCart() { 
  $.ajax({
    url : 'index.php?route=module/cart/check',
    type : 'POST',
    dataType : 'json',
    success : function (result) {
       if (result) {
        $(window).bind('beforeunload', function(){
          return 'leave?';
        });
       }
    }
  })
}


1
आप नहीं कर सकते। आप प्रोग्राम को ब्राउज़र बंद करने या आपके पृष्ठ से दूर नेविगेट करने वाले उपयोगकर्ता के बीच अंतर नहीं बता सकते।
meagar

@ क्रिस त्रुटि हुई?
पद्मनाथन जे।

आपके संदेश में कुछ कोड शामिल हैं जो एक अजाक्स ऑपरेशन को चलाने का संकेत देते हैं। क्या उनमें से कुछ को हमें ध्यान में रखने की आवश्यकता है? (क्योंकि उस कोड को छोड़कर, आपने स्पष्ट रूप से इसका उल्लेख नहीं किया था)
सिरिल एन।

आप यह नहीं बता सकते कि कोई विंडो बंद है या किसी अन्य URL पर नेविगेट करें, विचार करें कि जब आप मल्टी-टैब ब्राउज़र का उपयोग कर रहे हैं, तो कोई फर्क नहीं पड़ता है, लेकिन यदि आप हैश नेविगेशन (जैसे yourdomain.com/#path=/index) का उपयोग कर रहे हैं / समाचार और आईडी = 1 ), आप इसे नेविगेट करते समय जावास्क्रिप्ट फेंक सकते हैं
अल्फ़केविन

जवाबों:


145

आप JQuery का उपयोग करके ऐसा कर सकते हैं ।

उदाहरण के लिए ,

<a href="your URL" id="navigate"> click here </a>

आपका JQueryहोगा,

$(document).ready(function(){

    $('a').on('mousedown', stopNavigate);

    $('a').on('mouseleave', function () {
           $(window).on('beforeunload', function(){
                  return 'Are you sure you want to leave?';
           });
    });
});

function stopNavigate(){    
    $(window).off('beforeunload');
}

और छुट्टी संदेश प्राप्त करने के लिए सतर्क हो जाएगा,

$(window).on('beforeunload', function(){
      return 'Are you sure you want to leave?';
});

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

         logout();

});

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


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

कोड ठीक है। अगर उपयोगकर्ता "इस पृष्ठ को छोड़ें" पॉप बटन पर क्लिक करता है तो मैं लॉगआउट () फ़ंक्शन चलाना चाहता हूं। लेकिन मैं कैसे पता लगा सकता हूं कि उपयोगकर्ता ने "इस पृष्ठ को छोड़ें" पर क्लिक किया है या नहीं?
बिट_हंटर

1
$(window).on('unload', function()सफारी में इस पर अमल नहीं हो रहा है।
अरोही कुलकर्णी

1
beforeunloadओएस बंद होने के कारण ब्राउज़र बंद हो रहा है तो क्या आग लग जाएगी ?
techie_28

4
आप क्रोम या फ़ायरफ़ॉक्स में अब कस्टम संदेश नहीं दे सकते (क्योंकि वे घोटाले को रोकना चाहते हैं): Developers.google.com/web/updates/2016/04/…
एडम

12

अपने अजाक्स में जावास्क्रिप्ट का प्रयास करें

window.onbeforeunload = function(){
  return 'Are you sure you want to leave?';
};

संदर्भ लिंक

उदाहरण 2:

document.getElementsByClassName('eStore_buy_now_button')[0].onclick = function(){
    window.btn_clicked = true;
};
window.onbeforeunload = function(){
    if(!window.btn_clicked){
        return 'You must click "Buy Now" to make payment and finish your order. If you leave now your order will be canceled.';
    }
};

यहां वह उपयोगकर्ता को हर बार जब वह पृष्ठ छोड़ता है, तब तक वह अलर्ट करेगा, जब तक वह बटन पर क्लिक नहीं करता।

डेमो: http://jsfiddle.net/DerekL/GSWbB/show/


12

क्रेडिट यहाँ जाना चाहिए: कैसे पता लगाने के लिए अगर एक लिंक पर क्लिक किया गया था जब window.onbeforeunload ट्रिगर होता है?

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

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

window.onbeforeunload = function(e) {
    if(link_was_clicked) {
        return;
    }
    return confirm('Are you sure?');
}

2

जैसा कि यहां बताया गया है कि https://stackoverflow.com/a/1632004/330867 , आप इसे "फ़िल्टरिंग" द्वारा लागू कर सकते हैं जो इस पृष्ठ के बाहर निकलने की शुरुआत कर रहा है।

जैसा कि टिप्पणियों में उल्लेख किया गया है, यहां दूसरे प्रश्न में कोड का एक नया संस्करण है, जिसमें आपके प्रश्न में अजाक्स अनुरोध भी शामिल है:

var canExit = true;

// For every function that will call an ajax query, you need to set the var "canExit" to false, then set it to false once the ajax is finished.

function checkCart() {
  canExit = false;
  $.ajax({
    url : 'index.php?route=module/cart/check',
    type : 'POST',
    dataType : 'json',
    success : function (result) {
       if (result) {
        canExit = true;
       }
    }
  })
}

$(document).on('click', 'a', function() {canExit = true;}); // can exit if it's a link
$(window).on('beforeunload', function() {
    if (canExit) return null; // null will allow exit without a question
    // Else, just return the message you want to display
    return "Do you really want to close?";
});

महत्वपूर्ण : आपके पास एक वैश्विक चर परिभाषित (यहां canExit) नहीं होना चाहिए , यह यहां सरल संस्करण के लिए है।

ध्यान दें कि आप पूरी तरह से पुष्टिकरण संदेश (कम से कम क्रोम में) को ओवरराइड नहीं कर सकते। आपके द्वारा लौटाया जाने वाला संदेश केवल Chrome द्वारा दिए गए का ही होगा। यहाँ कारण है: मैं ऑनबियरनॉन्लोड डायलॉग को कैसे ओवरराइड कर सकता हूं और इसे अपने से बदल सकता हूं?


3
JQuery के रूप में 1.7 .liveपदावनत किया जाता है। इसके बजाय इसका $(document).on('click', 'a', ...) उपयोग किया जाना चाहिए। .onआम तौर पर पुराने कार्यों के लिए पसंदीदा तरीका है, इसलिए .bindयह होगा $('form').on('submit', ...)
t.niese

मुझे पूरा यकीन है कि यह उत्तर कोई और क्रॉस ब्राउज़र नहीं है। किसी ने इसका परीक्षण किया?
ए। वोल्फ

जैसा कि कहा गया है, मैं केवल कोड को कॉपी / पेस्ट करता हूं। मैं एक नए संस्करण के साथ उत्तर को संपादित करूँगा
सिरिल एन।

धन्यवाद, लेकिन दुर्भाग्य से जब मैं टैब बंद करता हूं, तो पुष्टि दिखाई नहीं देती है।
क्रिस

.. और एक बड़ी त्रुटि मैंने की (दस्तावेज़ घटना के रूप में पहले से लोड के बजाय क्लिक करें)।
सिरिल एन।

-1

इसे आज़माएं, ajaxरिटर्न स्टेटमेंट के माध्यम से डेटा लोड करना और प्रदर्शित करना।

<script type="text/javascript">
function closeWindow(){

    var Data = $.ajax({
        type : "POST",
        url : "file.txt",  //loading a simple text file for sample.
        cache : false,
        global : false,
        async : false,
        success : function(data) {
            return data;
        }

    }).responseText;


    return "Are you sure you want to leave the page? You still have "+Data+" items in your shopping cart";
}

window.onbeforeunload = closeWindow;
</script>

1
अपने उपयोगकर्ता को अपनी साइट में लिंक पर क्लिक करने पर हर बार एक तुल्यकालिक AJAX कॉल की प्रतिक्रिया के लिए प्रतीक्षा करने के लिए यह एक अच्छा विचार नहीं है।
मातृसत्ताक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.