سؤال

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

وكيف يمكنني موثوق الحفاظ على خيارات النموذج المحدد من قبل المستخدم عند النقر العودة (حتى لا تضطر إلى البدء من الصفر مع ملء استمارة الدخول مرة أخرى إذا كانوا تغيير واحد فقط من العديد من عناصر النموذج؟)

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

و(بيئة غير PHP / جافا سكريبت - وموقع يجب أن تعمل على IE6 + وFirefox2 +)

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

المحلول

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

نصائح أخرى

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

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

والامر متروك للمتصفح، ولكن في معظم الحالات لم يكن لديك لفعل أي شيء.

سوف

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

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

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

ولكن هل يمكن استخدام AJAX لتحميل تفاصيل النموذج المقدم من قبل على الحدث تحميل الصفحة.

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

مثال مسج كود:

$( document ).ready( function() {
  $.getJSON(
    "/getformdata.php",
    function( data ) {
      $.each( data.items, function(i,item) {
        $( '#' + item.eid ).val( item.val );
      } );
    });
} );

و/getformdata.php لديك قد إرجاع البيانات مثل:

{
  'items': [
    {
      'eid': 'formfield1',
      'val': 'John',
    },
    {
      'eid': 'formfield2',
      'val': 'Doe',
    }
  ]
}

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

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

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

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

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

$('#formSubmitButton').click( function() {
    var value = $('#searchbox').val();
    var days = 1;
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    document.cookie = "searchbox="+value+expires+"; path=/";
});

$(document).ready( function() {
    var nameEQ = "searchbox=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) var valueC = c.substring(nameEQ.length,c.length);
   }
   $('#searchbox').val(valueC);
});

ولم تختبر هذا ولكن يجب أن تعمل. سوف تحتاج مسج لذلك.

وجاءت وظائف كوكي من: http://www.quirksmode.org/js/cookies. أتش تي أم أل

وأود أن أقول بالمناسبة أن كلا من فايرفوكس وإنترنت إكسبلورر يكون هذا السلوك بشكل افتراضي.

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