سؤال

لدي صفحة تقوم بقدر كبير من العمل ولا أريد أن يتمكن المستخدم من التنقل بعيدًا عن تلك الصفحة (إغلاق المتصفح، الضغط على زر الرجوع، وما إلى ذلك) دون الحصول على تحذير.لقد وجدت أن الحدث onbeforeunload (الذي أعتقد أنه خاص بـ IE، والذي يعمل بشكل جيد بالنسبة لي لأن المشروع يستخدم الكثير من ActiveX) يعمل بشكل رائع.

المشكلة هي أنني أريد أن يكون المستخدم قادرًا على النقر على أيقونة "مساعدة" صغيرة في الزاوية العلوية اليمنى وفتح نافذة مساعدة في أي وقت.يؤدي هذا إلى تشغيل onbeforeunload، على الرغم من أن النافذة الرئيسية لا تنتقل إلى أي مكان أبدًا ولا يتم إلغاء تحميل الصفحة أبدًا.

تقوم وظيفة JavaScript التي يتم تشغيلها عند تشغيل الحدث onbeforeunload بوضع النص في events.returnValue.إذا تمكنت من التأكد، بطريقة أو بأخرى، من أن رمز المساعدة هو الذي تم النقر عليه، فلن أتمكن من وضع النص في events.returnValue في هذه الحالة.ولكن كيف يمكنني أن أجعل الصفحة تكتشف ذلك؟

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

المحلول

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

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>

نصائح أخرى

يحرر: "الحل البديل" الخاص بي أدناه هو مبالغة كاملة، بناءً على عدم فهمي.اذهب مع إجابة Shog9 أعلاه.

حسنًا، بينما كنت أكتب السؤال، توصلت إلى حل بديل سيعمل في الوقت الحالي.

لقد قمت بوضع متغير JavaScript عام ليكون بمثابة مؤشر منطقي بشأن ما إذا كان يتم تمرير الرمز فوقه أم لا.بعد ذلك، أقوم بإرفاق الأحداث بأحداث onmouseover وonmouseout الخاصة بالصورة وأكتب الوظائف التي ستحدد هذه القيمة.أخيرًا، قمت فقط بترميز الوظيفة التي تتعامل مع onbeforeunload والتي ستتحقق من هذه القيمة قبل تعيين events.returnValue.

ربما لا يكون الحل البديل خاليًا من العيوب ولكنه سيعمل في الوقت الحالي.

ستجد على الإنترنت العديد من الأشخاص يقترحون عليك استخدام شيء مثل

window.onbeforeunload = null

ولكن هذا لا يعمل بالنسبة لي في IE6.أثناء قراءتي لمستندات MSDN الخاصة بكائن الحدث، وجدت إشارة إلى خاصية events.cancelBubble، والتي اعتقدت أنها الحل.ولكن بفضل Orso الذي أشار إلى أن إعداد "event.cancelBubble=true" غير مجدي، فإن طريقة التخلص من مطالبة التأكيد هي استبعاد بيان الإرجاع تمامًا، واخترت استخدام متغير منطقي كعلامة لتحديد ما إذا كان سيتم ذلك أم لا إرجاع شيء أم لا.في المثال أدناه أقوم بإضافة كود جافا سكريبت بشكل برمجي في الكود الموجود خلف:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

ثم يحتوي زر المساعدة على علامة aspx التالية:

OnClientClick="postback=true;return true;

يؤدي هذا إلى تعيين متغير "إعادة النشر" إلى صحيح، والذي يتم التقاطه في الدالة ConfirmExit()، مما يؤدي إلى إلغاء الحدث.

آمل أن تجد هذه مفيدة.تم اختباره ويعمل في IE6 وFF 1.5.0.2.

لدي طريقة قديمة بعض الشيء ولكنها ستعمل في معظم الحالات.

أنشئ صفحة منبثقة "معلقة" تحتوي على مجموعة إطارات بإطار واحد بنسبة 100%، ثم ضع معالجات الأحداث العادية onUnload وonbeforeUnload في الرأس.

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

باستخدام هذه الطريقة، لديك الحرية في استخدام الصفحة الفعلية التي تريد رؤيتها، وإعادة النشر والنقر فوق الارتباطات التشعبية دون إطلاق الإطار الخارجي onUnload أو حدث onbeforeUnload.

إذا تم تحديث الإطار الخارجي أو إغلاقه بالفعل، فسيتم تشغيل الأحداث.

كما قلت، ليس إثباتًا كاملاً ولكن سيتم التغلب على إطلاق الحدث عند كل نقرة أو إعادة نشر.

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