الكشف عن ما إذا كان المستخدم بقي بعد دفع onBeforeUnload

StackOverflow https://stackoverflow.com/questions/821481

  •  03-07-2019
  •  | 
  •  

سؤال

في التطبيق على شبكة الإنترنت أعمل على التقاط onBeforeUnload أن تسأل المستخدم إذا كان حقا يريد الخروج.

الآن, إذا قرر البقاء هناك عدد من الأشياء التي أود القيام به.ما أحاول فهمه هو أنه في الواقع اختار البقاء.

لا يمكن بالطبع تعلن SetTimeout "س" ثانية, و إذا كان هذا حرائق ، فهو يعني المستخدم لا يزال هناك (لأننا لم نحصل على تفريغ).المشكلة هي أن المستخدم يمكن أن تتخذ في أي وقت أن يقرر ما إذا كان البقاء أو لا...

كنت آمل بينما الحوار كان يظهر SetTimeout المكالمات لن النار حتى يمكنني تعيين مهلة لفترة قصيرة ومن النار إلا إذا اختار المستخدم على البقاء.غير أن مهلة هل النار في حين أن الحوار هو مبين ، بحيث لا يعمل.

فكرة أخرى حاولت التقاط mouseMoves على النافذة/الوثيقة.في حين أن الحوار هو مبين ، mouseMoves في الواقع لا النار ، باستثناء واحد غريب استثناء حقا ينطبق على حالتي ، بحيث لن تعمل أيضا.

يمكن لأي شخص أن تفكر في طريقة أخرى للقيام بذلك ؟

وذلك بفضل!


(في حال كنت غريبة ، والسبب التقاط mouseMove لا يعمل هو أن لدي IFrame في صفحتي, يتضمن الموقع من مجال آخر.إذا كان في وقت التفريغ الصفحة التركيز داخل IFrame ، بينما يعرض مربع الحوار ، ثم أحضر الحدث MouseMove اطلاق النار مرة واحدة عند تحريك الماوس من داخل IFrame إلى الخارج (على الأقل في فايرفوكس).ربما الخلل, ولكن لا يزال, فمن المحتمل جدا أنه سوف يحدث في حالتنا, لذلك أنا لا يمكن استخدام هذا الأسلوب).

هل كانت مفيدة؟

المحلول

ما انتهى به كان ربط إلى الحدث انقر على المستند ، وعندما تلقيت انقر فكرت المستخدم قد بقيت.

هذا ليس حلا جيدا في معظم الحالات (إذا كنت DiggBar) سيكون لديك الكثير من السلبيات كاذبة (الناس أقاموا ولن تعرف ذلك), ولكن في حالتنا هذا منطقي لأن الناس تتفاعل بشكل كبير مع موقعنا ، ليس فقط مع مؤطرة المواقع.

Esentially ، لا...

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.
}

نصائح أخرى

لقد تم البحث في هذه المسألة على الانترنت خلال الأيام القليلة الماضية و الجواب دائما "لا" كنت لا أستطيع أن أقول بالتأكيد أن المستخدم بقي أو غادر (عدا حقيقة أن التطبيق الخاص بك إنهاء العمل إذا كان المستخدم الأوراق).أنا أكره "لا" إجابات.لقد جاء مع الأداة التالية.

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
});

شرط أن يسمى داخل المعالج لمعرفة إذا كان ينبغي تفعيل أو لا.إذا كان الأمر كذلك ، prefire يتم تنفيذها من قبل منبثقة تظهر للمستخدم (قد تحتاج إلى وقفة فيديو) و رد سوف يحدث فقط إذا كان المستخدم يبقى.

بلدي المنطق كان الشروع setTimeout في الجسم معالج الحدث.على setTimeout سوف يتم تنفيذ حتى يقوم المستخدم بالضغط على أحد الأزرار.بعد يفعلون ذلك حرائق على الفور.على setTimeout في هذه الحالة لا رد, ولكن وكيل الوظيفة أن ينفذ مهلة أخرى من أجل رد مع تأخير 20ms.إذا يبقى المستخدم على الصفحة ، الاستدعاء ينفذ.إن لم يكن, ثم آخر معالج تعلق onunload الذي مسح المهلة التي سوف نداء الاستدعاء ، وضمان أن الاستدعاء يسمى أبدا.لقد كان فقط فرصة للتحقق من ذلك في فايرفوكس, إنترنت إكسبلورر وكروم ، ولكنها نجحت حتى الآن في كل ثلاثة دون زوبعة.

آمل أن يساعد هذا الشعب بالإحباط كما كنت من قبل براءات الاختراع "لا" نظرا عالميا على هذا السؤال.هذا الرمز قد لا تكون مثالية ، ولكن أعتقد أنه على الطريق الصحيح.

وهذا هو أعلى ضرب لهذا النوع من السؤال وأنا أعرف حالة محددة (من 8 سنوات) لا يمكن استخدام هذا الحل لأنه كان في iFrame ، ولكن أي مستقبل القادمين من المحتمل أن يكون أكثر وساعد الجواب أقل من تلك المذكورة أعلاه:

يمكنك بسهولة معرفة إذا كانت قد بقيت مع الجسم حال المستمع ، أعتقد mousemove و keydown مجتمعة ينبغي أن يكون كافيا.

لمعرفة ما إذا كان اليسار, وأنت تسير في حاجة إلى بعض server الأشياء الجانبية.

جميع في كل شيء ، سوف ننظر بشيء من هذا القبيل (سيكون لديك لملء في المكالمات اياكس إلى الخادم نفسك):

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;
});

على جانب الملقم ، عليك استخدام شيء قبيح ، الموقت.جعل كومة من يحاول ترك ، وإزالتها إما طلب على البقاء ، أو بعد دقيقة أو حتى تأكيد ترك.لا أستطيع أن أتخيل أي حالة حيث معرفة إذا كان المستخدم اليسار هو أكثر من أي وقت حساس من بضع دقائق ، ولكن إذا كان لديك واحدة ، يرجى التعليق لأنني أريد أن تفكر في ذلك.

لماذا لا مجرد استخدام الأسلوب الذي ستاكوفيرفلوو لا, حيث يمكنك الحصول على مربع المنبثقة التي تمكنك من جعل الاختيار:

هل أنت متأكد من أنك ترغب في الانتقال من هذه الصفحة ؟

كنت قد بدأت كتابة أو تحرير آخر.

اضغط "موافق" للمتابعة أو إلغاء البقاء على الصفحة الحالية

ثم لا يهم كيف أنها تأخذ فترة طويلة.عند النقر على زر واحد ، مغادرتهم.إذا كانت فوق الأخرى ، فإنها تبقى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top