سؤال

لدي صفحة ويب x.php (في كلمة السر المحمية من موقع الويب الخاص بي) والتي لديها شكل الزر الذي يستخدم POST طريقة إرسال بيانات النموذج ويفتح x.php#abc.هذا يعمل بشكل جيد جدا.

ومع ذلك ، إذا كان المستخدمين تقرر أن تنقل في Internet Explorer 7, جميع الحقول في النص الأصلي x.php الحصول على مسح كل شيء يجب أن تكتب مرة أخرى.لا أستطيع حفظ المعلومات المنشورة في الدورة و أنا أحاول أن أفهم كيف يمكنني الحصول على IE7 أن تتصرف بالطريقة التي أريد.

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

session_name("FOO");
session_start();
header("Pragma: public");
header("Expires: Fri, 7 Nov 2008 23:00:00 GMT");
header("Cache-Control: public, max-age=3600, must-revalidate");
header("Last-Modified: Thu, 30 Oct 2008 17:00:00 GMT");

و الاختلافات منها.من دون نجاح.تبحث في إرجاع رؤوس مع أداة مثل يريشارك يظهر لي أن اباتشي هو في الواقع تكريم بلدي رؤوس.

لذا سؤالي هو:ما الخطأ الذي فعلته ؟

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

المحلول

أي سوف الاحتفاظ شكل محتويات على الزر مرة أخرى انقر فوق تلقائيا طالما:

  • لم مكسورة cacheing مع ذاكرة التخزين المؤقت لا pragma أو ما شابه
  • حقول النموذج في السؤال لم حيوي تم إنشاؤها بواسطة البرنامج النصي

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

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

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

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

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

نصائح أخرى

وبينما كان يحاول تضييق باستمرار المشكلة، لقد وجدت سبب مشكلتي. كنت تستخدم عناوين المواقع التي يجري إعادة كتابة من قبل أباتشي (أي أنا دائما الوصول صفحتي كما http://foo.com/page التي تم تعيينها من قبل أباتشي لhttp://foo.com/page.htm). باستخدام حقيقية حل عناوين المشكلة وجعلت IE7 سعيدة، طالما I تحديد العنوان المناسب HTTP (Cache-Control، Expires، الخ.).

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

function emitConditionalGet($timestamp)
{
    // See also http://www.mnot.net/cache_docs/
    // and code sample http://simonwillison.net/2003/Apr/23/conditionalGet/

    $gmdate_exp    = gmdate('D, d M Y H:i:s', time() + 1) . ' GMT';
    $last_modified = gmdate('D, d M Y H:i:s', $timestamp) . ' GMT';
    $etag          = '"'.md5($last_modified).'"';

    // If the client provided any of the if-modified-since or if-none-match
    // infos, take them into account:

    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
                       ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
    $if_none_match     = isset($_SERVER['HTTP_IF_NONE_MATCH'])
                       ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])     : false;

    if (!$if_modified_since && !$if_none_match)
    {
        return;  // the client does not cache anything
    }

    if ($if_none_match && $if_none_match != $etag)
    {
        return;  // ETag mismatch: the page changed!
    }
    if ($if_modified_since && $if_modified_since != $last_modified)
    {
        return;  // if-modified-since mismatch: the page changed!
    }

    // Nothing changed since last time client visited this page.

    header("HTTP/1.0 304 Not Modified");
    header("Last-Modified: $last_modified");
    header("ETag: $etag");
    header("Cache-Control: private, max-age=1, must-revalidate");
    header("Expires: $gmdate_exp");
    header("Pragma: private, cache");
    header("Content-Type: text/html; charset=utf-8");
    exit;
}

function emitDefaultHeaders($timestamp)
{
    $gmdate_exp    = gmdate('D, d M Y H:i:s', time() + 1) . ' GMT';
    $last_modified = gmdate('D, d M Y H:i:s', $timestamp) . ' GMT';
    $etag          = '"'.md5($last_modified).'"';

    header("Last-Modified: $last_modified");
    header("ETag: $etag");
    header("Cache-Control: private, max-age=1, must-revalidate");
    header("Expires: $gmdate_exp");
    header("Pragma: private, cache");
    header("Content-Type: text/html; charset=utf-8");
}

function getTimestamp()
{
    // Find out when this page's contents last changed; in a static system,
    // this would be the file time of the backing HTML/PHP page. Add your
    // own logic here:
    return filemtime($SCRIPT_FILENAME);
}

// ...

$timestamp = getTimestamp();
emitConditionalGet($timestamp);
emitDefaultHeaders($timestamp); //previously, this variable was mistyped as "$timestaml"

وفايرفوكس يفعل هذا النوع من التخزين المؤقت. وأنا أفهم سؤالك، وتريد IE7 لتتصرف بالطريقة فايرفوكس يفعل. أعتقد أن هذا غير ممكن.

وفايرفوكس وIE7 تختلف عن الطريقة التي تفسر الزر مرة أخرى.

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

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

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

وهكذا أنا وضعت الخلفي زر مخبأ ثقيل.

عن الشر والسوء مقابل وعلى شبكة الإنترنت، لكنه يجعلها قادرة لصفحات على التصرف كيف يتوقع الناس لهم التصرف بدلا من تزييفها سحرية في كل مكان.

<script type="text/javascript">//<!-- <![CDATA[
(function(){
    if( document.location.hash === "" )
    {
        document.location.hash="_";
    }
    else
    {
      var l = document.location;
      var myurl = ( l.protocol + "//" + l.hostname + l.pathname + l.search); 
      document.location = myurl;
    }
})();
//]]> --></script>

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

وإذا كنت هناك أول مرة، فإنه سيتم الكشف عن "لا تجزئة"، وتضيف "#_" لرابط الصفحة. إذا كنت هناك ل> 1st الوقت (أي: لا وجود صلة مباشرة إلى صفحة)، صفحة لديها بالفعل #_ على ذلك، لذلك بإزالته وفي عملية إزالته، وموجبات إعادة تحميل الصفحة.

هل يمكن استخدام الإكمال التلقائي = "إيقاف" في الحقول. بهذه الطريقة لن يكون مؤقتا القيم من قبل المتصفح لذلك لن يكون شغلها القيم في النموذج عند قيام المستخدم بالنقر فوق الزر الخلفي.

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