window.onbeforeunload دعا مرتين في فايرفوكس - حول كيفية الحصول على هذا؟

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

سؤال

وأنا خلق نافذة منبثقة الذي يحتوي على معالج beforeunload المثبتة. عند استخدام "إغلاق" عنصر القائمة ملف لإغلاق النوافذ المنبثقة، ويسمى معالج beforeunload مرتين، مما أدى إلى اثنين "هل أنت متأكد أنك تريد إغلاق هذه النافذة؟" رسائل الظهور.

وهذا هو الخلل مع فايرفوكس، ولقد أفيد هنا ، ولكن ما زلت ترغب في الحصول على وسيلة لمنع هذا من الحدوث. يمكنك التفكير في طريقة سليمة للكشف عن beforeunload مزدوجة لمنع المشكلة رسالة مزدوجة؟ والمشكلة هي أن فايرفوكس لا تقول لي أي زر في الحوار المستخدم المنتخبين للنقر - OK أو إلغاء

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

المحلول 3

وهذا هو بالتأكيد خلل FF. لقد ذكرت ذلك في https://bugzilla.mozilla.org/show_bug.cgi؟ ID = 531199

نصائح أخرى

<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>

وتعيين متغير في معالج لمنع الحوار الخروج للمرة الثانية. استخدام setTimeout لإعادة تعيينها بعد ذلك.

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

وانظر كود الماضي في:

HTTP: // الاجتماعية .msdn.microsoft.com / منتديات / EN / sharepointinfopath / موضوع / 13000cd8-5c50-4260-a0d2-bc404764966d

ولقد وجدت هذه المشكلة في كروم 21، فايرفوكس 14، IE 7-9، سفاري 5 (على PC).

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

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();

وإنشاء متغير عمومي التي تم تعيينها إلى true داخل معالج. تظهر فقط في حالة تأهب / المنبثقة عند هذا المتغير هو زائف.

وأنا استخدم المقتطف التالي لتتبع exitcount

عند تحميل الصفحة تتم تهيئة exitCount المتغير التالي

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

وفي حال النافذة تفريغ

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});

ولقد وجدت أنه بدلا من القيام الدعوة الخاصة بك لتأكيد ()، لا مجرد even.preventDefault ()؛ داخل الحدث beforeunload. فايرفوكس تبرزها الحوار تأكيد الخاص بها. لست متأكدا إذا كان هذا هو الصحيح شيء / القياسية القيام به، ولكن هذه هي الطريقة التي كنت أفعل ذلك.

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

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

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

وكل ما عليك القيام به هو لتصفية الحدث الذي أنا مهتم في طريق الاستعلام عن الحدث الأصلي:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

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

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