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

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

سؤال

ولست بحاجة لايجاد ما إذا كان المستخدم النقر المتصفح زر العودة أو زر التحديث.

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

ولست بحاجة للقيام بذلك في جافا سكريبت لصفحة ASP.net بلدي

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

المحلول

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

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

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

والسلوك الصحيح ثم إذا كان المستخدم يقوم به الملاحة "الخطأ" (مثل يخطو إلى الوراء، إعادة == زيارة مرتين) هو الحصول عليه مرة أخرى على المسار الصحيح. عدم إعطاء رسالة خطأ أنه لا يستطيع الهروب! كما لا يسمح له لإعادة تحميل أو العودة، وقال انه لا يوجد لديه خيارات اليسار.

نصائح أخرى

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

وتنفيذ PageToken باستخدام ارشد / أو الطابع الزمني المخزنة في الدورة ومقارنة قيمة إلى حقل مخفي على النموذج. فعلت ذلك عن طريق <لأ href = "http://www.codeproject.com/Tips/328386/How-to-prevent-Re-Post-action-caused-by-pressing-b" يختلط = "نوفولو" عنوان = "الصفحة رمز"> PageToken الدرجة . إذا كانت قيمة من حقل مخفي ومتغير جلسة العمل لا تتطابق ثم كنت خارجا من التوافق ويمكنك التعامل مع ذلك. هو خدعة لتعيين كافة الأحداث على صفحتك.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

في أسلوب حدث قبل كود العادية:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}

مع Site.Master

في Site.Master الخاص بك، ووضع بعد <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

بدون Site.Master

في رمز مشترك الخاصة بك، ووضع بعد <body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

وافترض أنك تريد أن تفعل ذلك لأن ما بعد الظهر لتجنب إعادة تقديم بعض الإجراءات أو البيانات أليس كذلك؟ ومن المفارقات أن هذا لم يكن كبيرا كما في مشكلة مرة أخرى قبل نماذج ويب ASP.NET ... لأنك قد عموما إضافة إلى URL مختلفة بدلا من نفس واحدة (يشبه إلى حد كبير asp.net بعثة التحقق المشتركة في الواقع).

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

<html><body onload="location.replace('someURL.asp')"></body></html>

وفعلنا ذلك في جاوة / Struts1 عن طريق وضع الملكية على زر الإرسال. إذا تم النقر على زر سوف يتم إرسال النص زر في الممتلكات في ActionForm. إذا كان المستخدم تحديثها المعلومات لم يتم تعيين قيمة، حيث كنا نعرف ان المستخدم لا النقر فوق الزر. في هذه الحالة حيث كانت خاصية فارغة، عدنا وأصدرت الصفحة الأولى من pageflow. YMMV في ASP.Net.

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

if(performance.navigation.type == 2)
{
    //Do your code here
}

والصافي 3.5 قادرة على التعامل بشكل جيد للغاية المتصفح الظهر (وإلى الأمام) الأزرار. البحث مع جوجل: "Scriptmanager EnableHistory". يمكنك التحكم في أي إجراءات المستخدم سيضيف دخول إلى تاريخ المتصفح (ScriptManager -> AddHistoryPoint) وتطبيق ASP.NET الخاص يتلقى حدث كلما قام المستخدم بالنقر فوق المتصفح أزرار الخلف / الأمام.

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