عند تطوير الويب، غالبًا ما نستخدم حدث إغلاق الصفحة قبل التحميل، والذي يمكن أن يمنح المستخدمين فرصة لاختيار التخلي عن الإغلاق، مثل محرر المدونة هذا. إذا اختار المستخدم المغادرة، فسيتم تشغيل حدث onunload بشكل طبيعي، ولكن إذا اختار المستخدم الإلغاء، فكيف يمكن اكتشافه؟
نحن نفترض أن الصفحة تترك حدث إلغاء يسمى onunloadcancel. من الواضح أن هذا الحدث يجب أن يتم إطلاقه بعد أن يضغط المستخدم على زر الإلغاء في مربع الحوار. لكن عملية التشغيل لإغلاق مربع حوار المطالبة ليست بهذه البساطة. لنراجع العملية أولاً:
انسخ رمز الكود كما يلي:
window.onbeforeunload = وظيفة ()
{
إرجاع "هل ستغادر حقًا؟"؛
}
عندما يكون المستخدم جاهزًا لمغادرة الصفحة (مثل الضغط على زر الإغلاق، أو تحديث الصفحة، وما إلى ذلك)، يتم تشغيل الحدث onbeforeunload. لا يستطيع البرنامج النصي الخاص بنا أن يقرر ما إذا كان سيتم منع الصفحة من الإغلاق في هذا الحدث، والشيء الوحيد الذي يمكنه فعله هو إرجاع سلسلة فقط كنص توضيحي في مربع حوار التحديد القريب . ولكن أي واحد نختار، ليس لدينا طريقة لمعرفة ذلك.
ومع ذلك، إذا قمنا بتحليل هذه المسألة بعناية، فهذا ليس هو الحال في الواقع. إذا اختار المستخدم حقًا إغلاق الصفحة، فسيتم حذف جميع التعليمات البرمجية قيد التشغيل، وإذا استمر المستخدم في البقاء على الصفحة، فسيتم التعامل معها كما لو لم يحدث شيء، باستثناء حدث onbeforeunload. لذلك، قمنا بخدعة صغيرة في حدث onbeforeunload وقمنا بتسجيل مؤقت هنا سيبدأ بعد بضعة مللي ثانية. إذا كانت الصفحة مغلقة بالفعل، فسيكون المؤقت غير صالح بالطبع، وستظل الصفحة موجودة، وسيظل التأخير لن يكون هناك أي خطأ في حدث تفاعل الواجهة غير المتزامن بطبيعته.
انسخ رمز الكود كما يلي:
<لغة البرمجة = "جافا سكريبت">
window.onbeforeunload = وظيفة ()
{
setTimeout(onunloadcancel, 10);
إرجاع "هل ستغادر حقًا؟"؛
}
window.onunloadcancel = وظيفة ()
{
تنبيه ("إلغاء المغادرة")؛
}
</script>
نحن نستخدم setTimeout والتأخير 10 مللي ثانية لتنفيذ إلغاء التحميل. إذا تم إغلاق الصفحة بالفعل، فسيتم تدمير الموقتات بالطبع؛ وإلا، استمر. ولكن أثناء الاختبار، تم اكتشاف أن فايرفوكس به خطأين:
في بعض الأحيان، عند الضغط على زر الإغلاق، سيتم أيضًا تنفيذ onunloadcancel، وسيومض مربع حوار. إذا قمت بالتغيير إلى while(1); فسيظل المتصفح عالقًا، مما يعني أنه سيتم تنفيذ onunloadcancel بالفعل، ولكنه يدمر الواجهة فقط، لكنه لا يوقف تشغيل البرنامج النصي مؤقتًا.
إذا غادرت عن طريق تحديث الصفحة، فسيتم تنفيذ onbeforeunload مرة واحدة فقط، ولكن إذا قمت بالنقر فوق الزر X لإغلاق الصفحة، فسيتم تنفيذ onbeforeunload مرتين. لذلك، مازلنا بحاجة إلى تحسينه ليكون متوافقًا مع FF.
انسخ رمز الكود كما يلي:
<لغة البرمجة = "جافا سكريبت">
var_t;
window.onbeforeunload = وظيفة ()
{
setTimeout(function(){_t = setTimeout(onunloadcancel, 0)}, 0);
إرجاع "هل ستغادر حقًا؟"؛
}
window.onunloadcancel = وظيفة ()
{
ClearTimeout(_t);
تنبيه ("إلغاء المغادرة")؛
}
</script>
يتم استخدام طريقة هنا لا أستطيع شرح سببها، وينبغي اعتبارها بمثابة اختراق لحل الخطأ في FF.