2011-01-10 16 views
26

जब कोई व्यक्ति किसी विशेष पृष्ठ से अपने काम को सहेजे बिना नेविगेट करने का प्रयास करता है तो मैं एक संवाद बॉक्स पॉप अप कर रहा हूं। मैं जावास्क्रिप्ट की ऑनबर्ननलोड घटना का उपयोग करता हूं, बहुत अच्छा काम करता है।पता करने के लिए कि उपयोगकर्ता ने जावास्क्रिप्ट ऑनबॉर्नलोड लोड पर रद्द किया है या नहीं?

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

क्या यह संभव है? मैं भी jQuery का उपयोग कर रहा हूं, तो क्या शायद एक घटना हो सकती है जैसे कि पहले से लोड करने के लिए मैं बांध सकता हूं?

अद्यतन: विचार वास्तव में बचाने के लिए है और एक अलग वेबपेज जो उपयोगकर्ताओं को सीधे अगर वे

+0

मुझे नहीं लगता कि यह संभव है ... लेकिन मुझे आशा है कि मैं गलत हूं। – keithjgrant

+0

मैं वास्तव में उत्सुक हूं कि आप एक कस्टम संवाद के साथ नेविगेटर को कैसे अवरुद्ध करते हैं। क्या आप कोड प्रदान कर सकते हैं? – jAndy

+0

@jAndy, जावास्क्रिप्ट में onforeforeloadload घटना को देखो, यह वास्तव में यह करता है। –

उत्तर

44

आप इस तरह यह कर सकते हैं:

$(function() { 
    $(window).bind('beforeunload', function() { 
     setTimeout(function() { 
      setTimeout(function() { 
       $(document.body).css('background-color', 'red'); 
      }, 1000); 
     },1); 
     return 'are you sure'; 
    }); 
}); 

कोड पहले setTimeout विधि के भीतर 1ms की देरी है। यह सिर्फ UI queue में फ़ंक्शन जोड़ने के लिए है। चूंकि setTimeout असीमित रूप से चलता है क्योंकि जावास्क्रिप्ट दुभाषिया सीधे return कथन को कॉल करके जारी रखेगा, जो बदले में ब्राउज़र modal dialog को ट्रिगर करता है। यह UI queue को अवरुद्ध करेगा और मोडल बंद होने तक पहले setTimeout से कोड निष्पादित नहीं किया जाएगा। यदि उपयोगकर्ता ने रद्द किया दबाया है, तो यह एक और सेटटाइम ट्रिगर करेगा जो लगभग एक सेकंड में आग लग जाएगा। यदि उपयोगकर्ता ठीक से पुष्टि करता है, तो उपयोगकर्ता रीडायरेक्ट करेगा और दूसरा सेटटाइम कभी नहीं निकाल दिया जाएगा।

उदाहरण: http://www.jsfiddle.net/NdyGJ/2/

+0

मैं लिंक पर गया लेकिन खिड़की बंद करने पर कुछ भी नहीं हुआ। क्रोम का उपयोग ... –

+0

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

+0

क्रोम में आप इसे 0 एमएमएस देरी पर सेट कर सकते हैं और यह काम करता है। आईई में आपको लंबा टाइमआउट होना चाहिए या यह बाहर निकलना होगा। –

1
नहीं

संभव रद्द चुना है। शायद कोई मुझे गलत साबित करेगा ... आप किस कोड को चलाने के लिए चाहते हैं? क्या आप रद्द करते समय ऑटो-सेव करना चाहते हैं? यह काउंटर-अंतर्ज्ञानी लगता है। यदि आप पहले से ही ऑटो-सेव नहीं करते हैं, तो मुझे लगता है कि जब वे "रद्द करें" दबाते हैं तो ऑटो-सेव करने के लिए यह बहुत कम समझ में आता है। हो सकता है कि आप अपने ऑनबेरनलोड हैंडलर में सेव बटन को हाइलाइट कर सकें ताकि उपयोगकर्ता देख सके कि उन्हें नेविगेट करने से पहले क्या करना है।

+0

विचार वास्तव में तब सहेजना है जब उन्हें रद्द करना चुना जाता है और उन्हें एक अलग वेबपृष्ठ पर निर्देशित किया जाता है। –

2

मुझे नहीं लगता था कि यह संभव हो गया था, लेकिन सिर्फ इस विचार की कोशिश की और यह काम करता है (हालांकि यह एक हैक की क्या कुछ है और सभी ब्राउज़रों में एक ही काम नहीं कर सकता):

window.onbeforeunload = function() { 
    $('body').mousemove(checkunload); 
    return "Sure thing"; 
}; 

function checkunload() { 
    $('body').unbind("mousemove"); 
    //ADD CODE TO RUN IF CANCEL WAS CLICKED 
} 
+1

यदि आप साइट छोड़ने के लिए ठीक क्लिक करने के बाद अपना माउस ले जाते हैं, तो "रद्द कोड" चलाया जाता है ... –

+0

मुझे लगता है कि आप mousemove ईवेंट को बाध्य करने से पहले एक टाइमआउट जोड़ सकते हैं, जो इसे ठीक कर सकता है, हालांकि इससे यह और भी अधिक हो जाता है एक हैक –

+1

मौजूदा विंडो गायब होने में 1 सेकंड से अधिक समय लगता है और यदि आप अपना माउस ले जाते हैं, तो यह रद्दीकरण की तरह दिखता है। टाइमर होने के कारण जेडी के जवाब में एक ही कमी है जो मेरे लिए सही काम नहीं करता है। –

4

मैं जानता हूँ कि इस सवाल का अब पुराना है, लेकिन इस मामले में किसी को भी है अभी भी इस के साथ मुद्दों कर, मैं एक समाधान मेरे लिए काम करने लगता है कि,

मूल रूप से unload घटना के बाद beforeunload ई निकाल दिया जाता है पाया है वेंट। हमें टाइमआउट beforeunload घटना में बनाया रद्द करने के लिए इसका उपयोग कर सकते JANDY के जवाब को संशोधित:

$(function() { 
    var beforeUnloadTimeout = 0 ; 
    $(window).bind('beforeunload', function() { 
     console.log('beforeunload'); 
     beforeUnloadTimeout = setTimeout(function() { 
      console.log('settimeout function'); 
      $(document.body).css('background-color', 'red'); 
     },500); 
     return 'are you sure'; 
    }); 
    $(window).bind('unload', function() { 
     console.log('unload'); 
     if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0) 
      clearTimeout(beforeUnloadTimeout); 
    }); 
}); 

संपादित करें:jsfiddle here

+0

क्या यह आपके लिए काम करता है? क्योंकि मेरे मामले में मुझे टाइमर फ़ंक्शन निष्पादित करने के बाद 'अनलोड' मिलता है ... (मैंने फ़ायरफ़ॉक्स 35 में परीक्षण किया) –

+0

हाँ यह मेरे लिए काम करता है, अपने टाइमआउट फ़ंक्शन के लिए समय बढ़ाने का प्रयास करें। –

+0

मैंने कुछ और परीक्षण किया है और पता चला है कि अगर मैं लगभग 5 सेकंड (0.5 के बजाय) डालता हूं तो यह अपेक्षा के अनुसार काम करता है। लेकिन मुझे लगता है कि अगर आप संवाद रद्द करते हैं तो बहुत अधिक है ... बहुत बुरा हम उस पर कोई बेहतर प्रतिक्रिया नहीं प्राप्त करते हैं। –

-5
window.onbeforeunload = function() { 
    if (confirm('Do you want to navigate away from this page?')) { 
     alert('Saving work...(OK clicked)') 
    } else { 
     alert('Saving work...(canceled clicked)') 
     return false 
    } 
} 
इस कोड के साथ

भी यदि पर 'रद्द करें' IE8 में उपयोगकर्ता क्लिक करता है डिफ़ॉल्ट नेविगेशन संवाद दिखाई देगा।

+3

आप 'onbeforeunload' से जुड़े फ़ंक्शन के अंदर 'पुष्टिकरण()' का उपयोग नहीं कर सकते। –

+0

@ ज्योति: ऐसा लगता है कि आप [किसी और के उत्तर] पर टिप्पणी करना चाहते थे (http://stackoverflow.com/a/4670938/177710v)। ऐसा करने के लिए, एक ठोस उत्तर के नीचे 'एक टिप्पणी जोड़ें' लिंक पर क्लिक करें। कृपया इस उत्तर को थ्रेड से हटा दें क्योंकि अभी यह एक गलत उत्तर का डुप्लिकेट है जो अन्यथा जल्द ही डाउनवॉट हो जाएगा। – Oliver

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

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