2011-06-13 13 views
9

मैं एक ऑनलाइन संपादक पर एक ऑटोसेव सुविधा का उपयोग कर रहा हूं।लॉगआउट पर "अनलोड" ईवेंट और AJAX कॉल के साथ स्वत: सहेजना: क्रियाओं का क्रम एक समस्या उत्पन्न कर रहा है

जब कोई उपयोगकर्ता पृष्ठ छोड़ देता है (unload या beforeunload ईवेंट के साथ पता चला), तो मैं डेटा को सहेजने के लिए AJAX अनुरोध (async = false) भेज रहा हूं।

मैं क्योंकि घटनाओं की है कि सेरी हो रहा है क्रोम में कभी कभी फ़ायरफ़ॉक्स एट में एक समस्या है:

  • गतिविधि सक्रिय
  • अनुरोध भेजने
  • पेज परिवर्तन और उपयोगकर्ता के कट जाने
  • अनुरोध सर्वर => समस्या का विश्लेषण!
  • अनुरोध प्रतिक्रिया ब्राउज़र
बेशक

द्वारा प्राप्त के बाद से उपयोगकर्ता डिस्कनेक्ट किया गया है "बचाने" अनुरोध संभाला नहीं जा सकता।

क्या पृष्ठ वास्तव में बदलने से पहले AJAX कॉल की प्रतिक्रिया के लिए सभी ब्राउज़रों के साथ संगत है, क्या कोई तरीका है?

उत्तर

6

नहीं। आप केवल उपयोगकर्ता के लिए एक पुष्टि संवाद प्रदर्शित कर सकते हैं:

$(window).bind('beforeunload', function() { 
    // AJAX 

    return 'STRING'; 
}); 

STRING संवाद में प्रदर्शित किया जाएगा, और फिर आप समय हो सकता है प्रतिक्रिया वापस आने के लिए के लिए करने से पहले उपयोगकर्ता प्रतिक्रिया करते हैं।

लेकिन यह एकमात्र तरीका है जिसे आप अनलोडिंग से किसी पृष्ठ को अवरुद्ध कर सकते हैं, इसलिए AJAX प्रतिक्रिया प्राप्त नहीं की जाएगी।

+0

+1 "नंबर" के रूप में +1 यहां सब कुछ कहना है;) – naugtur

+1

+1 - उपर्युक्त के अतिरिक्त, आपका संदेश उपयोगकर्ता को सहेजे गए परिवर्तनों के बारे में चेतावनी दे सकता है और उन्हें पृष्ठ पर रहने का अवसर प्रदान कर सकता है और स्वयं को सहेजने पर क्लिक कर सकता है। पृष्ठ अनलोड पर AJAX सिंक या async के लिए कोई गारंटीकृत तरीका नहीं है। कुछ ब्राउज़र्स, कुछ "सर्वश्रेष्ठ प्रयास" करेंगे, कुछ ब्राउज़र प्रक्रिया को बंद करते समय ब्राउज़र विंडो को समाप्त कर देंगे (किसी भी चीज़ के लिए कोई मौका नहीं)। – BenSwayne

11

ओरि का उत्तर सही और पूर्ण है।

लेकिन आपके मामले से निर्णय लेने से आप एक वर्कअराउंड का उपयोग कर सकते हैं।

दो हैं जावास्क्रिप्ट आप में रुचि हो सकती विशेषताएं: localStorage और sessionStorage (यह दूसरा एक को छोड़कर एक ही ब्राउज़र पास पर साफ कर दिया जाता है, ताकि आप probabli पहले का चयन करेंगे)

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

सबूत:

$(window).bind('unload', function() { 
    localStorage.setItem('unsavedData',data); 
    localStorage.setItem('unsaved',true); 
}); 

$(document).ready(function(){ 
    if(localStorage.getItem('unsaved')){ 
     //ajax send 
     localStorage.setItem('unsaved',false); 
    } 
}); 

[संपादित करें]

मैं सफलतापूर्वक unload साथ JSONP का उपयोग कर किया गया है और यह समय की सबसे काम करने के लिए लग रहा था, लेकिन मैं लोड के अंतर्गत यह परीक्षण नहीं किया और धीमी नेटवर्क पर।

+1

चारों ओर एक अच्छा काम है, लेकिन इसके लिए एचटीएमएल 5 की आवश्यकता होगी, नहीं? यह पुराने ब्राउज़र के साथ कोई समस्या हो सकती है या नहीं भी हो सकती है। मुझे यह पसंद है हालांकि +1 –

+1

स्थानीय स्टोरेज IE8 के रूप में पुराना है। – naugtur

+1

धन्यवाद, अच्छा विचार, मैंने इसे लागू किया है और अब तक अच्छा दिखता है। मैं जेस्टोरेज स्क्रिप्ट (http://www.jstorage.info/) का उपयोग कर रहा हूं, यह आईई 6 + समर्थन भी देता है –

0

सहेजने के लिए एक होवर ईवेंट के साथ अपने पृष्ठ के शीर्ष पर एक निश्चित पारदर्शी div के बारे में क्या? बस एक रचनात्मक दृष्टिकोण के रूप में सोचने के लिए सोचें ... अब आपके पास बचाए रखें, लेकिन एक असफलता के रूप में, मैं सोच रहा हूं कि औसत उपयोगकर्ता नेविगेट करने जा रहा है, तो पहले वे माउस को एड्रेस बार, बैक बटन पर ले जाएंगे , या बंद बटन। यदि आप डोम विंडो के शीर्ष पर कब्जा करते हैं, तो शायद कुछ और सफल अंतिम मिनट बचाएंगे?

इसके अलावा, आप setTimeout() पर परिवर्तनों को धक्का दे सकते हैं लेकिन ऐसा लगता है कि आप मेरे दोनों समाधानों की तुलना में कुछ अधिक सीमित हैं।

0

असींक को झूठ में बदलना आसान काम करना आसान होगा।

अन्यथा आप सर्वर को async के साथ कॉल कर सकते हैं: सत्य और जब यह सफलतापूर्वक या त्रुटि के साथ आता है तो आप लॉगआउट/रीडायरेक्ट/त्रुटि संदेश के लिए एक कस्टम ईवेंट बढ़ा सकते हैं।

एक होवरिंग पारदर्शी div का उपयोग सर्वर को जवाब देने के लिए उपयोगकर्ता को प्रतीक्षा रखने के लिए किया जा सकता है।

+0

उपयोगकर्ता उपयोगी नहीं है अगर उपयोगकर्ता किसी टैब को बंद करता है या किसी अन्य यूआरएल पर नेविगेट करता है। प्रश्न उपयोगकर्ता को सहेजने के बाद रहने के लिए मनाने के बारे में नहीं था, लेकिन रहने के बारे में फैसला करने के बाद बचत के बारे में नहीं था। – naugtur

+0

क्या मैं इस सवाल को गलत समझा सकता हूं, जब मैं लॉगआउट लिंक हिट करता हूं तो डेटा को सहेजने के बारे में बात कर रहा था, लेकिन जब वह पृष्ठ से दूर जाता है तो वही काम किया जा सकता है। बिंदु जब आवश्यक हो तो सर्वर पर वापस सहेजे गए डेटा को सिंक करना है, आप इसे समय-समय पर कर सकते हैं (जैसे कुछ मेल सेवाएं जैसे जीमेल) या उपयोगकर्ता इंटरैक्शन पर। –

+0

ओपी पहले से ही कर रहा है, लेकिन यह 'अनलोड' घटना के विनिर्देशों के कारण विफल रहता है – naugtur

0

मैं कुछ इसी तरह के लिए ऑनबेरनलोड का उपयोग कर रहा हूं, लेकिन मेरा डेटा पेलोड काफी छोटा है (एक guid), और मुझे किसी भी वापसी मूल्य की आवश्यकता नहीं है, इसलिए यह आग और भूल गई है। यह लगभग 95% समय काम करता है, लेकिन अलग-अलग ब्राउज़र अलग-अलग लागू होते हैं, ऑननलोड, इत्यादि अलग-अलग होते हैं।

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

बेशक, पहला समाधान - उपयोगकर्ता से पूछें, फिर उन्हें बचाने दें शायद सबसे अच्छा है। शायद वे अंतिम बचत के बाद से किसी भी बदलाव को बचाने से रोकने के लिए बंद कर रहे हैं?