2012-01-05 8 views
7

दिया जाता है मुझे लगता है कि वेब ब्राउज़र में चलाता है एक खेल (एक प्लगइन के रूप में) मिल गया है और मैं क्या करने की कोशिश कर रहा हूँ है:AJAX प्रतिक्रिया जब तक बंद करने से वेब ब्राउज़र की रोकथाम

  1. अगर पता लगाने उपयोगकर्ता जब तक हम अपने वेब सेवाओं के लिए एक कॉल आग लॉग इन करने की है कि उपयोगकर्ता ब्राउज़र

  2. बंद कर दिया है ब्राउज़र बंद करने के (Alt + F4, 'X' बटन आदि से टकराने) को बंद करने से

  3. रोकें ब्राउज़र का फैसला किया है

  4. एक बार हमें वेब सेवाओं से प्रतिक्रिया प्राप्त हो जाने के बाद, लॉक को छोड़ दें और ब्राउजर को अनुरोध के रूप में बंद करने दें।

मुख्य कारण है कि हम ऐसा करना चाहते हैं हम कुछ संगामिति समस्या हो रही है और हमारे लॉग हम लोगों को बाहर/प्रवेश करने वास्तविक मामलों में जहां प्लगइन दुर्घटनाग्रस्त हो गया है से ब्राउज़र बंद को अलग करना चाहते हैं के माध्यम से जा रहे हैं है।

मैं JQuery के साथ ऐसा करने में देखा (एक्स-ब्राउज़र संगतता के लिए - ओपेरा काम करेंगे नहीं, लेकिन हम ओपेरा के ऐसे उपयोगकर्ताओं वैसे भी शुक्र है की जरूरत नहीं है):

$(window).bind('beforeunload', function(e) { 
    e.preventDefault(); 
    // make AJAX call 
}); 

समस्या यह है कि इस प्रदर्शित करता है उपयोगकर्ता को एक पुष्टिकरण संवाद ('क्या आप वाकई इस पृष्ठ को छोड़ना चाहते हैं') जिसे उपयोगकर्ता AJAX कॉल भेजने से पहले पुष्टि कर सकता है।

तो सवाल यह है कि प्रतिक्रिया प्राप्त होने तक ब्राउज़र को बंद होने से रोकने का कोई तरीका है? पृष्ठ को बदलते समय भी 'पहले से लोड' आग लगती है - क्या वास्तव में बंद होने पर लिंक पर क्लिक करने पर अंतर करने का कोई तरीका है?

किसी भी मदद के लिए आभारी है!

+0

जिज्ञासा से बाहर ... क्या आप "preventDefault" और "AJAX कॉल करें" भागों को स्वैप करते हैं तो कोई अंतर है? – hugomg

उत्तर

6

मधुमक्खियों से ब्राउज़र विंडो से बचने के लिए इसका मुश्किल व्यवसाय बंद है। असल में, ऐसा करने का कोई तरीका नहीं है, जैसा कि आपने वर्णन किया है, onbeforeunload ईवेंट से गैर-undefined मान लौटने के अलावा।

एक संभावित सुझाव है जो मैं कर सकता हूं, ईवेंट के भीतर AJAX अनुरोध सिंक्रनाइज़ कर रहा है। उदाहरण के लिए

window.onbeforeunload = function() { 
    $.ajax({ 
     url: '/foo', 
     type: 'GET', 
     async: false, 
     timeout: 4000 
    }); 
}; 

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

आपका अन्य प्रश्न (लिंक पर क्लिक करने के बीच अंतर कैसे करें), काफी सरल है। जैसा कि ऊपर वर्णित है, onbeforeunload दिखता है कि उसके ईवेंट हैंडलर से क्या लौटाया जा रहा है।तो मान हम एक चर जो है हमारे आवेदन के लिए वैश्विक देता है, हम जैसे

var globalIndicator = true; 

// ... lots of code 

window.onbeforeunload = function() { 
    return globalIndicator; 
}; 

कुछ कर सकते हैं इस बिंदु पर, हम हमेशा एक पुष्टिकरण संवाद प्राप्त होगा जब विंडो/टैब के बारे में बंद कर दिया करने के लिए है। हम चाहते हैं कि से बचने के लिए किसी भी लंगर-क्लिक के लिए चाहते हैं, हम इसे पसंद

$('a[href^=http]').on('click', function() { 
    globalIndicator = undefined; 
}); 
+0

धन्यवाद आपके इनपुट के लिए एंड्रियास; इसलिए प्रतिक्रिया प्राप्त होने तक ब्राउज़र को बंद होने से रोकने का कोई तरीका नहीं है ... समस्या यह है कि खिलाड़ी धीमे कनेक्शन पर है; 2 सेकंड शायद कॉल करने के लिए पर्याप्त नहीं हो सकता है। किसी लिंक पर क्लिक करने के बीच अंतर करने के लिए स्पष्टीकरण के लिए धन्यवाद - सबसे उपयोगी – csdev86

+0

यदि आप इस बारे में सोचते हैं कि इसका उपयोग कैसे किया जा सकता है, तो यह स्पष्ट है कि कोई भी ब्राउज़र किसी पृष्ठ को बंद होने से पहले मनमाने ढंग से लंबे समय तक अवरुद्ध करने की अनुमति नहीं देगा। यदि यह संभव था, तो कोई भी पॉपअप विज्ञापन कर सकता था जिसे उपयोगकर्ता कभी बंद नहीं कर सकता था। – smorgan

0

मुझे पूरा यकीन है कि आप जो चाहते हैं वह जावास्क्रिप्ट का उपयोग करना संभव नहीं है। लेकिन चूंकि आपके पास ब्राउज़र प्लगइन है, तो क्या आप यह जांचने में सक्षम नहीं होंगे कि आपकी प्लगइन ऑब्जेक्ट सही तरीके से साफ हो गई है या नहीं? मुझे यकीन नहीं है कि क्या आप ActiveX, NPAPI या फ़ायरब्रीथ जैसे कुछ उपयोग कर रहे हैं, लेकिन इन ढांचे में सभी जीवनशैली विधियां हैं जिन्हें सामान्य शटडाउन की स्थिति में आपकी प्लगइन पर कॉल किया जाएगा, इसलिए आपको कुछ लिखने में सक्षम होना चाहिए इस बिंदु पर लॉग इन करें। यदि प्लगइन दुर्घटनाग्रस्त हो जाता है, तो इन्हें नहीं बुलाया जाएगा।

+0

तथ्य यह है कि हम प्लगइन से कॉल को विश्वसनीय रूप से कॉल नहीं कर पाए थे, यही वजह है कि वेब ब्राउजर से इसे देखना शुरू कर दिया। – csdev86

1

अपने प्रश्न के पहले भाग के रूप में पैच सकता है, वहाँ window.onbeforeunload का उपयोग कर के अलावा अन्य को बंद करने से ब्राउज़र को रोकने का कोई विश्वसनीय तरीका है। ब्राउज़र उपयोगकर्ता की सेवा करने के लिए है और यदि उपयोगकर्ता अपने ब्राउज़र को बंद करना चुनता है तो यह ऐसा करेगा।

$('a').click(function(e) {...}); 

आप इस का उपयोग कर सकता है, उदाहरण के लिए, सुनिश्चित करें कि एक क्लिक करने के लिए:

अपने दूसरे प्रश्न के लिए, यह jQuery द्वारा एक onbeforeunload घटना को ट्रिगर अन्य घटनाओं से एक लिंक पर एक क्लिक के भेद करने के लिए यथोचित आसान है unbeforeunload ट्रिगर नहीं करेगा:

$('a').click(function(e) {window.onbeforeunload = null}); 
1

आप नीचे दिए गए कोड का उपयोग कर सकते से ब्राउज़र को रोकने के लिए बंद कर दिया हो रही है: -

window.onbeforeunload = function() { 

//Your code goes here. 

    return ""; 
} 

अब जब उपयोगकर्ता ब्राउज़र बंद कर देता है तो उसे रिटर्न की वजह से पुष्टिकरण संवाद मिलता है; & उपयोगकर्ता की पुष्टि & के लिए प्रतीक्षा करता है यह प्रतीक्षा समय सर्वर तक पहुंचने का अनुरोध करता है।

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