2009-05-04 23 views
9

एक वेब ऐप में मैं काम कर रहा हूं, मैं उपयोगकर्ता से पूछने के लिए पहले से लोड कर रहा हूं कि वह वास्तव में बाहर निकलना चाहता है।यह पता लगाने के बाद कि उपयोगकर्ता आगे बढ़ने के बाद रुक गया है

अब, यदि वह रहने का फैसला करता है, तो ऐसी कई चीजें हैं जिन्हें मैं करना चाहता हूं। जो मैं समझने की कोशिश कर रहा हूं वह यह है कि उसने वास्तव में रहने का फैसला किया।

मैं निश्चित रूप से "एक्स" सेकंड के लिए सेटटाइमआउट घोषित कर सकता हूं, और अगर वह आग लगती है, तो इसका मतलब यह होगा कि उपयोगकर्ता अभी भी वहां है (क्योंकि हमें अनलोड नहीं किया गया था)। समस्या यह है कि उपयोगकर्ता यह तय करने के लिए किसी भी समय ले सकता है कि क्या रहना है या नहीं ...

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

मैंने कोशिश की एक और विचार खिड़की/दस्तावेज़ पर माउसमोव को कैप्चर कर रहा है। जबकि संवाद दिखाया गया है, माउसमोव वास्तव में आग नहीं लगाते हैं, एक अजीब अपवाद को छोड़कर जो वास्तव में मेरे मामले पर लागू होता है, ताकि वह काम न करे।

क्या कोई ऐसा करने के अन्य तरीके के बारे में सोच सकता है?

धन्यवाद!


(मामले आप उत्सुक हैं में, कारण कब्जा MouseMove काम नहीं करता है कि मैं अपने पेज में एक IFrame है, किसी अन्य डोमेन की एक साइट युक्त है। पेज उतारने के समय में हैं, फोकस आईफ्रेम के भीतर है, जबकि संवाद दिखाता है, तो माउस को IFrame के अंदर से बाहर ले जाने पर माउसमोव इवेंट फायरिंग मिल जाता है (कम से कम फ़ायरफ़ॉक्स में)। शायद यह एक बग है, लेकिन फिर भी, यह बहुत संभावना है कि ' हमारे मामले में होगा, इसलिए मैं इस विधि का उपयोग नहीं कर सकता)।

उत्तर

6

जो मैंने समाप्त किया वह मेरे दस्तावेज़ के लिए क्लिक ईवेंट में शामिल था, और एक बार मुझे एक क्लिक प्राप्त हुआ, मुझे लगा कि उपयोगकर्ता रुक गया था।

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

अनिवार्य रूप से, मेरा कोड यह करता है ...

function OnBeforeUnload() { 
    Event.observe(document, "click", UserStayed); 
    if (IConsiderTheIFrameMightBeTryingToPopOut) { 
     return "The site is trying to escape. Do you want to stay?"; 
    } 
} 

function UserStayed() { 
Event.stopObserving(document, "click", UserStayed); 
    // New we know the user is still with us for sure. 
} 
+0

आप महोदय, मेरे नायक हैं। – Pascal

+0

मदद की खुशी है? –

+0

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

-7

क्यों न सिर्फ विधि StackOverflow करता है, का उपयोग करें, जहाँ आप एक पॉपअप बॉक्स देता है कि मिल आप विकल्प बनाने:

क्या आप वाकई इस पृष्ठ से दूर नेविगेट चाहते हैं?

आपने एक पोस्ट लिखना या संपादित करना शुरू कर दिया है।

OK दबाएं जारी रखने के लिए, या वर्तमान पृष्ठ

पर रहने के लिए अभी तो यह कोई फर्क नहीं पड़ता कि कितनी देर तक वे ले। यदि वे एक बटन पर क्लिक करते हैं, तो वे जाते हैं। अगर वे दूसरे पर क्लिक करते हैं, तो वे रहते हैं।

+0

मैं ऐसा कर रहा हूं। लेकिन मैं एक बार रुकने के बाद कुछ सामान करना चाहता हूं, केवल अगर वे रुक गए। मैं मूल रूप से सर्वर को यह बताता हूं कि वे रहते हैं, जिसका मतलब है कि अनलोड को आईफ्रेम से बाहर निकलने का प्रयास करने के कारण होता था, न कि खिड़की को बंद कर दिया। यह मुझे अनलोड के संभावित कारणों को लॉग करने देता है, जिसे मैं बाद में सामान कर सकता हूं। लेकिन मैं केवल यह करना चाहता हूं अगर वे रुक गए, तो मैं यह सुनिश्चित करना चाहता हूं कि वे सर्वर को सूचित करने से पहले रहे। –

+0

तो "सामान" के निष्पादन को ट्रिगर करने के लिए पॉपअप में "मैं रहना चाहता हूं" बटन-क्लिक का उपयोग करें। शायद मैं समस्या को समझ नहीं रहा हूँ। –

+1

हम्म, "मैं रहना चाहता हूं" बटन ब्राउज़र से संबंधित है, न कि मेरे लिए। मैं इसे छू नहीं सकता या कुछ भी नहीं कर सकता, यह एक मानक संवाद है कि मैं बिल्कुल भी बातचीत नहीं कर सकता। और जहां तक ​​मुझे पता है, विंडो/दस्तावेज़ में कोई विशिष्ट घटना नहीं है जो उपयोगकर्ता ट्रिगर करता है जब उपयोगकर्ता रहने का फैसला करता है। –

3

मैं पिछले कुछ दिनों और जवाब के लिए ऑनलाइन इस सवाल पर शोध किया गया है, सदा ही, "नहीं" आपको बता नहीं सकता यकीन के लिए, कि एक उपयोगकर्ता पर रोक लगा दी या तथ्य यह है कि तुलना में छोड़ दिया (अन्य है आपके यदि उपयोगकर्ता छोड़ देता है तो ऐप काम करता है)। मुझे "नहीं" जवाब से नफरत है। मैं निम्नलिखित उपयोगिता के साथ आया था।

var OnBeforeUnload = (function(){ 
    var 
    FDUM = new Function, 
    AFFIRM = function(){ return true; }; 

    var _reg = function(msg,opts){ 
     opts = opts || {}; 
     var 
      pid = null, 
      pre = typeof opts.prefire == 'function' ? opts.prefire : FDUM, 
      callback = typeof opts.callback == 'function' ? opts.callback : FDUM, 
      condition = typeof opts.condition == 'function' ? opts.condition : AFFIRM; 

     window.onbeforeunload = function(){ 
      return condition() ? (pre(),setTimeout(function(){ pid = setTimeout(callback,20); },1),msg) : void 0; 
     } 

     window.onunload = function(){ clearTimeout(pid); }; 

    } 

    var _unreg = function(){ window.onbeforeunload = null; } 

    return { 
     register : _reg, 
     unregister : _unreg 
    }; 

})(); 

तो, एक फोन जैसे

OnBeforeUnload.register('Hello!',{ 
    condition:function_that_returns_true_to_fire_event_false_to_ignore, 
    prefire:function_to_call_on_page_exit_attempt, 
    callback:function_to_call_if_user_stays 
}); 

हालत अगर यह सक्रिय या नहीं करना चाहिए देखने के लिए हैंडलर के भीतर बुलाया जाएगा। यदि ऐसा है, तो उपयोगकर्ता को पॉपअप दिखाए जाने से पहले प्रीफ़ीयर निष्पादित किया जाता है (आप एक वीडियो को रोकना चाहते हैं) और कॉलबैक केवल तभी होगा जब उपयोगकर्ता रहता है।

मेरा तर्क घटना हैंडलर के शरीर में सेटटाइमआउट शुरू करना था। सेटटाइमआउट तब तक निष्पादित नहीं होगा जब तक कि उपयोगकर्ता बटनों में से किसी एक को दबाए। वे करने के बाद, यह तुरंत आग लगती है। इस मामले में setTimeout कॉलबैक को कॉल नहीं करता है, लेकिन एक प्रॉक्सी फ़ंक्शन जो 20ms की देरी के साथ कॉलबैक के लिए एक और टाइमआउट निष्पादित करता है। यदि उपयोगकर्ता पृष्ठ पर रहता है, तो कॉलबैक निष्पादित होता है। यदि नहीं, तो एक और हैंडलर ऑनलोड से जुड़ा हुआ है जो टाइमआउट को साफ़ करता है जो कॉलबैक को कॉल करेगा, यह सुनिश्चित करना कि कॉलबैक कभी नहीं कहा जाता है। मुझे केवल फ़ायरफ़ॉक्स, आईई और क्रोम में इसे जांचने का मौका मिला है, लेकिन इसने बिना किसी हिचकी के तीनों में काम किया है।

मुझे उम्मीद है कि इससे लोगों को निराश होने में मदद मिलेगी क्योंकि मैं पेटेंट "नहीं" द्वारा इस सवाल के लिए सार्वभौमिक रूप से दिया गया था। यह कोड सही नहीं हो सकता है, लेकिन मुझे लगता है कि यह सही रास्ते पर है।

+0

यह केवल मेरे लिए काम करता है अगर मैं कई सेकंड में टाइमआउट सेट करता हूं। अन्यथा, जब उपयोगकर्ता ने पृष्ठ छोड़ने के लिए बटन पर क्लिक किया, तो 'कॉलबैक' (function_to_call_if_user_stays) अभी भी कॉल किया गया। मेरे मामले में, ऐसा इसलिए है क्योंकि अनुरोध किया गया लिंक जो onbeforeunload() को ट्रिगर करता है सर्वर से वापस आने में कई सेकंड लगते हैं, इसलिए कुछ सेकंड के लिए ऑननलोड() को कॉल नहीं किया जाता है। – CyberMonk

0

यह इस प्रकार के प्रश्न के लिए शीर्ष हिट है, और मुझे पता है कि विशिष्ट मामला (8 साल पहले से) इस समाधान का उपयोग नहीं कर सका क्योंकि यह आईफ्रेम में था, लेकिन भविष्य के किसी भी कॉमर्स की शायद अधिक सहायता होगी ऊपर दिए गए उत्तर से नीचे का जवाब:

आप आसानी से बता सकते हैं कि वे बॉडी इवेंट श्रोता के साथ रहे हैं, मुझे लगता है कि मूसमॉव और कीडाउन संयुक्त होना चाहिए।

यह बताने के लिए कि क्या उन्होंने छोड़ा है, आपको कुछ सर्वर साइड सामान की आवश्यकता होगी।

कुल मिलाकर, यह कुछ इस तरह दिखाई देंगे (आप सर्वर अपने आप से ajax कॉल को भरने के लिए होगा):

window.addEventListener("beforeunload", function(event){ 
    //tell your server they are attempting to leave 
    var tryLeaveID = serverLogAttempToLeave(); 

    //an element with giant letters and warning text, because you can no longer set text on the alert box 
    var unsavedWarning = document.getElementById("unsavedChangesWarning"); 
    unsavedWarning.style.display = "block"; 

    var onStay = function() { 
     //if they stay, tell your server so 
     serverRevokeAttemptToLeave(tryLeaveID); 
     unsavedWarning.style.display = "none"; 
     document.body.removeEventListener("mousemove", onStay); 
     document.body.removeEventListener("keydown", onStay); 
    } 

    document.body.addEventListener("mousemove", onStay); 
    document.body.addEventListener("keydown", onStay); 


    var dialogText = "undisplayed text"; 
    event.returnValue = dialogText; 
    return dialogText; 
}); 

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

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