سؤال

أنا أكتب تطبيقًا، إذا رد المستخدم، فقد يعيد إرسال نفس المعلومات ويفسد تدفق البيانات وسلامتها.كيف يمكنني تعطيله للمستخدمين الذين يستخدمون جافا سكريبت أو لا يستخدمونه؟

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

المحلول

هذا غير ممكن، للأسف.ومع ذلك، ضع في اعتبارك نموذج التنقل في التطبيقات الخاصة بك.هل تستخدم نموذج النشر/إعادة التوجيه/الحصول على PRG؟ http://en.wikipedia.org/wiki/Post/Redirect/Get?

هذا النموذج أكثر ملائمة لزر الرجوع من نموذج Postback.

نصائح أخرى

لا ينبغي لك.

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

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

ربما يمكنك التفكير بدلاً من ذلك في طرح السؤال:"كيف تتجنب كسر زر الرجوع لـ <أدخل السيناريو الخاص بك هنا>؟"

إذا كانت إجابة سكوت قريبة من العلامة، ففكر في تغيير التدفق إلى نموذج PRG.إذا كان الأمر شيئًا آخر، فقم بتقديم المزيد من التفاصيل وانظر كيف يمكننا المساعدة.

لقد توصلت إلى اختراق صغير يعمل على تعطيل زر الرجوع باستخدام JavaScript.لقد قمت بفحصه على Chrome 10 وفايرفوكس 3.6 وIE9:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
     window.location.href += "#";
     setTimeout("changeHashAgain()", "50"); 
}

function changeHashAgain() {
  window.location.href += "1";
}

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);


</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit back!
</body>
</html>

الخيار الأفضل هو عدم الاعتماد على عمليات إعادة النشر للتحكم في التدفق، ولكن إذا كنت عالقًا في ذلك (في الوقت الحالي)

يمكنك استخدام شيء مثل هذا:

  Response.Cache.SetCacheability(HttpCacheability.NoCache);
  Response.Cache.SetExpires(Now.AddSeconds(-1));
  Response.Cache.SetNoStore();
  Response.AppendHeader("Pragma", "no-cache");

ستجد قريبًا أنه لن يعمل على جميع المتصفحات، ولكن بعد ذلك يمكنك إجراء فحص في الكود الخاص بك مثل:

 if (Page.IsPostBack)
 {
        if (pageIsExpired()){
           Response.Redirect("/Some_error_page.htm");
        }
        else {
           var now = Now;
           Session("TimeStamp") = now.ToString();
           ViewState("TimeStamp") = now.ToString();
        }

  private boolean pageIsExpired()
  {
     if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
        return false;

     if (Session("TimeStamp") == ViewState("TimeStamp"))
        return true;

        return false;
  }

سيؤدي ذلك إلى حل المشكلة إلى حد ما، ولم يتم تحديد الكود - فقط لأغراض الأمثلة..

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

 <script>
window.location.hash="no-back-button";
window.location.hash="Again-no-back-button";//for google chrome
window.onhashchange=function(){window.location.hash="no-back-button";}
</script> 

وصف تفصيلي

وهذه مشاركة سابقة عنه:منع استخدام زر الرجوع (في IE)

كل ما توصلت إليه لتعطيل زر الرجوع قد لا يوقف زر الرجوع في المتصفحات المستقبلية.

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

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

history.go(+1);

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

يمكنك نشر البيانات الموجودة في كل نموذج في نافذة _NEW.سيؤدي هذا إلى تعطيل زر الرجوع في كل نافذة، ولكن بدون جافا سكريبت قد يكون من الصعب إغلاق الزر القديم بالقوة.

كتب 4 شباب من رولا هذا المقال حول تعطيل زر الرجوع منذ وقت طويل (في مجرة ​​بعيدة): http://www.4guysfromrolla.com/webtech/111500-1.shtml

لقد تمكنت من تحقيق ذلك باستخدام:

 Response.Cache.SetExpires(DateTime.MinValue);
 Response.Cache.SetNoStore();

عندما استخدمت Response.Cache.SetCacheability(HttpCacheability.NoCache);منعني من تنزيل ملفات المكتب.

تجد الرابط أدناه

تعطيل وظيفة زر استعادة المتصفح باستخدام JavaScript في ASP.NET | زر عودة المتصفح ASP.NET (باستخدام JavaScript)

http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html

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