سؤال

لقد بحثت على الويب حول هذا السؤال لكنني لم أجد شيئا:

ما هو منطق زر الظهر؟ ما يحدث عندما تضغط على الزر الخلفي على متصفح الويب؟

أنا حقا أود أن أفهم المزيد عن ذلك.

شكرا لك.

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

المحلول

يحتفظ مستعرض الويب الخاص بك بمكدسة (أو قائمة، إذا كنت كذلك) من صفحات الويب التي قمت بزيارتها في تلك النافذة. دعنا نقول صفحتك الرئيسية هو google.com ومن هناك يمكنك زيارة عدد قليل من المواقع الأخرى: youtube.com و yahoo.com و cnn.com. عند زيارة آخر واحد، تبدو القائمة هكذا:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                            ^
                                            |
                                       current page

عند الضغط على الزر الخلفي، يأخذك المتصفح إلى الصفحة السابقة في القائمة، مثل هذا:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                ^
                                |
                           current page

في هذه المرحلة، يمكنك الضغط مرة أخرى لأخذك إلى Youtube.com، أو يمكنك الضغط على الأمام لوضعك في CNN.com مرة أخرى. دعنا نقول أنك تضغط مرة أخرى مرة ثانية:

google.com -> youtube.com -> yahoo.com -> cnn.com
                   ^
                   |
              current page

إذا ذهبت الآن، فقل، ABC.com، تتغير القائمة لتبدو كهذا:

google.com -> youtube.com -> abc.com
                               ^
                               |
                          current page

لاحظ أن كل من Yahoo.com و CNN.com ذهبت من القائمة. هذا لأنك أخذت طريق جديد. يحافظ المتصفح فقط على قائمة الصفحات التي قمت بزيارتها للوصول إلى حيث أنت الآن، وليس تاريخا لكل صفحة قمت به من أي وقت مضى. لا يعرف المتصفح أيضا أي شيء عن هيكل الموقع الذي تزوره، مما قد يؤدي إلى بعض السلوك المفاجئ.

أنت على موقع تسوق (NEAM، كمثال قصير) يحتوي على فئات ومفاتورة فرعية من المنتجات لتصفحها. وقد قدم مصمم الموقع بعناية فتات الخبز بالقرب من الجزء العلوي من النافذة للسماح لك بالتنقل من خلال الفئات. تبدأ في أعلى الصفحة من الموقع، انقر فوق الأجهزة، ثم الذاكرة. تبدو القائمة الآن مثل هذا:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
                                           ^
                                           |
                                      current page

تريد العودة إلى فئة الأجهزة، بحيث تستخدم فتات الخبز للتصنيف إلى الفئة الأصل بدلا من استخدام الزر الخلفي. الآن تبدو قائمة المتصفح هذه:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                                          ^
                                                          |
                                                     current page

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

أخيرا، تريد العودة إلى صفحة الموقع الرئيسية (NEA.com). يمكنك استخدام فتات الخبز، ولكن هذه المرة تنقر فوق الزر الخلفي - يبدو من الواضح أنه يجب أن يأخذك إلى مستوى واحد، أليس كذلك؟ ولكن أين يأخذك؟

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

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                            ^
                                            |
                                       current page

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

هل سيكون الأمر رائعا إذا سمح المتصفحات ببرنامج مصممي الموقع ببرنامج الزر الخلفي للقيام بالأشياء الواضحة (يأخذك إلى مستوى) بدلا من كل ما تفعله الآن؟

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

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

نصائح أخرى

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

الفكرة الأساسية هي العودة إلى الصفحة الأخيرة أو قسم الموقع المنطقي.

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

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

أعتقد أن أسهل طريقة لشرح هذا في pseudocode:

class Page:
    String url, ...
    Page previous, next # implements a doubly-linked list

class History:
    Page current # current page

    void back():
        if current.previous == null:
            return
        current = current.previous
        refresh()

    void forward():
        if current.next == null:
            return
        current = current.next
        refresh()

    void loadPage(Page newPage):
        newPage.previous = current
        current.next = newPage # remove all the future pages
        current = current.next
        display(current)

يتم الاحتفاظ بتاريخ الصفحات التي تظهر في شكل تشبه المكدس. عند "البوب" أعلى ثلاث صفحات (A، B، C، على سبيل المثال) ثم انتقل إلى صفحة مختلفة D، لا يمكنك الوصول إلى B مرة أخرى عن طريق الضغط على الأمام.

ك devoloper، يجب عليك التأكد من أن WebApp يعمل بغض النظر عن كيفية معالجة المتصفح الزر الخلفي :-) هل إعادة إرسال الطلب؟ هل هذا هو الطلب الجديد المطابق للقديم، أو هل يختلف بأي شكل من الأشكال؟ هل سيسأل المستعرض المستخدم تأكيد إعادة النشر؟ ما هي عناصر الصفحة سيتم إعادة طلبها وما الذي تم تحميله من ذاكرة التخزين المؤقت؟ هل يحترم المتصفح رؤوس التحكم في ذاكرة التخزين المؤقت؟

تعتمد الإجابات على هذه السؤال على إصدار واستعلام من إعدادات المستعرض وإعدادات المستخدم. تصميم لك البرامج بحيث لا يهم كل هذا كثيرا.

آسف لعدم إجابة مباشرة للغاية، ولكن هناك بعض الإجابات على التوالي هنا بالفعل.

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

يقوم المتصفح بتحميل الصفحة الأخيرة المشوهة قبل المرء الحالي، ثم يتبع أي إعادة توجيه قد يحدث؟

يبدو أنني أفتقد نقطة السؤال.

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