Чому прапорець залишається позначеним при перезавантаженні сторінки?


81

Я перезавантажую веб-сторінку з таким кодом:

<label for="showimage">Show Image</label>
<input id="showimage" name="showimage" type="checkbox" value="1" />

Незважаючи на те, що HTML, що залишається у браузері, однаковий для кожного перезавантаження сторінки, прапорець завжди приймає перевірене значення, коли було виконано перезавантаження. Іншими словами, якщо користувач ставить прапорець і перезавантажує, цей прапорець все ще встановлюється.

Тут відбувається кешування?

Редагувати : Я спробував наведене нижче рішення Гордона Белла і виявив, що це все ще відбувається навіть після видалення значення = "1". Ще щось, що мені може не вистачати?

<label for="showimage">Show Image</label> 
<input id="showimage" name="showimage" type="checkbox" /> 

Відповіді:


38

Так, я вважаю, що це кешування. Я бачу таку поведінку у Firefox, наприклад (не Safari, для чого це варто :)).

ви можете перезавантажити сторінку та обійти кеш (у Firefox), використовуючи CTRL- SHIFT- Rі ви побачите, що контрольне значення не несе (звичайне CTRL- Rоднак захопить інформацію з кешу)

редагувати : мені вдалося вимкнути цю сторону сервера у Firefox, встановивши заголовок кешування кешу:

Cache-Control: no-store

здається, це вимикає функцію "запам'ятовувати значення форми" у Firefox


Так, CTRL-SHIFT-R призводить до скидання прапорців. Чи є спосіб запобігти цьому кешування?
Прочитано лише

я не думаю (принаймні, не з боку сервера). firefox дійсно агресивно кешує речі. мені вдалося змусити його перестати надійно кешувати в таких ситуаціях з боку клієнта
Оуен

2
він захоплює значення з кешу, отже, кешування. хіба що я неправильно зрозумів, що ви намагаєтесь сказати.
Оуен

1
Агресивне кешування Firefox - це основний PITA, який мене завжди вражає при розробці проти нього. Я раніше не пробував заголовок Cache-Control, але якщо він працює, stackoverflow просто виправдав час, який я тут проводжу.
Круачан

1
Ці значення надходять не з "кеш-пам’яті", як у завантаженому файловим сховищем Firefox. наприклад: Якщо ви вийдете звідти, а потім підете за тією самою URL-адресою, сторінка буде кешована, але значень не буде. Порушивши кеш-пам’ять, ви можете змусити жорстко перезавантажити, але це випадковість, що це також вимикає функцію.
bobince

165

Додати autocomplete="off" в елемент форми на сторінці. Недоліком є ​​те, що це неприпустимий XHTML, але він вирішує проблему без будь-якого заплутаного JavaScript.


1
У мене працює, де заголовок кеш-контролю не працює.
Lajos Meszaros

7
З того, що я читав , це є на насправді діє в HTML5. (Я підтримав попередній коментар, перш ніж прочитати більше про цю тему.) Тож використовуйте автозаповнення до душі, якщо ви використовуєте HTML5.
EF0

3
Через 10 років. Ця відповідь врятувала мені головний біль!
Даан ван ден Берг

33

set autocomplete = "off" з js також добре працює.

наприклад, використовуючи jquery:

$(":checkbox").attr("autocomplete", "off");

Дякую, це мені дуже допомогло. :)
Любомир Шайдарів

1
Я виявив, що вам потрібно, $("#formId").attr("autocomplete", "off")де #formIdє ідентифікатор вашої форми.
Dan Diplo

@DanDiplo є багато випадків, коли ми використовуємо прапорець без форми, тому застосовувати його нелогічно ("#formId"). Attr ("автозаповнення", "вимкнено")
Клейн Дзільва

2
@ClainDsilva Те, що ви можете використовувати прапорець поза формою, не означає, що, на мою думку, є нелогічним. Ви можете стверджувати, що це не зовсім вичерпно (хоча це працює для більшості сценаріїв), але говорити, що це не логічно, химерно, враховуючи, що це працює.
Dan Diplo

@DanDiplo, коли ми можемо застосувати автоматичне вимкнення лише до прапорця, він працює нормально, таким чином, я згоден, що ваше рішення працює, але воно також застосовується до всіх елементів у вікні форми. Однак це може бути не передбачуваною поведінкою. Питання звузилось лише до прапорця, а не до всієї форми. З усією повагою, я просто хочу знайти найкраще рішення з урахуванням питання. У цьому контексті застосовувати автозаповнення для цілої форми неправильно.
Clain Dsilva

1

Це приємна особливість Firefox: якщо ви щось вводите, але перезавантажуєте сторінку, текст залишається в текстовій області. Ідентифікатор інших вибраних вами налаштувань.

На жаль, це не працює в SO (імовірно, скидає JS) і в більш тупих браузерах, таких як IE ...

Що пропонує підказку: якщо вам дійсно потрібно це зробити, скиньте форму за допомогою JS. form.reset () може виконати роботу (діє як кнопка Скинути введення).


1
Здається, трохи хакерський, або як стріляти у горобця з гармати.
Lajos Meszaros

@ MészárosLajos Що таке хакерство / надмірність, і чому ви бачите це як таке? Ви бачите щось простіше?
PhiLho

Що робити, якщо ви бажаєте лише частково скинути форму? Я особисто хочу лише вимкнути кеш вводу для прапорців, але не для текстових полів. Я повністю з вами згоден, що це хороша особливість Firefox, але не для користувацьких двох державних кнопок, які в основному перероблені. Інша справа, навіщо використовувати javascript, де ви можете просто використовувати властивість html, щоб запобігти цій поведінці? І так, я знаю, "autocomplete = off" робить HTML-код недійсним, але сторінка все одно працює.
Lajos Meszaros

3
"це приємна особливість Firefox": якщо ви натискаєте прапорці фільтрації на сторінці результатів пошуку, а потім перезавантажуєте їх, перевірені фільтри не мають сенсу при відображенні набору даних. -Я кажу, що це основний ПДФО, як було зазначено раніше.
Sharky

Я б ніколи не називав це приємною функцією ... так, це допомагає, коли ви вводите багато тексту, а потім потрібно оновити сторінку, але якщо ви розробляєте інтерфейс, це далеко не приємно особливість.
userfuser

1

Це старе питання, але все ще активне питання для firefox. Жодна з відповідей, які я спробував, не вирішила, але те, що вирішило це для мене, було просто таким:

    document.getElementById('formId').reset();

Це просто скидає форму до параметрів за замовчуванням при кожному завантаженні сторінки. Не ідеально, оскільки ви втрачаєте детальний контроль, але це єдине, що вирішило це для мене.


0

або замість f5 натисніть Enter у адресному рядку :)


1
Або запропонуйте користувачеві зробити це, швидше (це питання розробника).
містер Т.А.

Ми не можемо очікувати, що користувачі завжди оновлюватимуть сторінку за допомогою Crtl + Shift + R, чи не так?
Lajos Meszaros

0

Це може бути через кешування браузера - дуже корисно для статичних веб-сайтів, які не змінюються занадто часто, дуже погано для динамічних веб-додатків.
Спробуйте використати ці два метатеги в головному розділі сторінки. Другий мета-тег призначений для старих браузерів (IE5), які не розпізнають мета-тег "no-cache" і хоча різні дають однаковий результат: кожен запит надходить на сервер.

<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="-1">

Чи насправді ми дбаємо про такі старі браузери, як IE5? До речі, надсилання заголовків за допомогою PHP здається дещо кращим, тому що ви використовуєте менше мета-тегів у <head>
Лайош Месарос

2
Його відповідь була у 2008 році, коментар @ MészárosLajos - у 2014 році. Тоді так, це мало значення.
Дуніяднд,


0

громадська ідея вирішити це

зробити форму і скинути кнопку - -

<form>
<checkbox>
<reset>
</form>

$(reset).trigger("click");//to clear the cache and input 
$(checkbox).trigger("click");//to mark checkbox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.