Tại sao hộp kiểm vẫn được chọn khi tải lại trang?


80

Tôi đang tải lại một trang web có mã sau:

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

Mặc dù HTML được gửi đến trình duyệt giống nhau cho mỗi lần tải lại trang, hộp kiểm luôn nhận giá trị đã chọn khi thực hiện tải lại. Nói cách khác, nếu người dùng chọn hộp kiểm và tải lại, hộp kiểm vẫn được chọn.

Có một số bộ nhớ đệm đang diễn ra ở đây?

Chỉnh sửa : Tôi đã thử giải pháp của Gordon Bell bên dưới và thấy rằng điều này vẫn xảy ra ngay cả sau khi loại bỏ giá trị = "1". Tôi còn thiếu gì nữa không?

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

Câu trả lời:


38

Vâng, tôi tin rằng đó là bộ nhớ đệm. Tôi thấy hành vi này trên Firefox chẳng hạn (không phải Safari, cho những gì đáng giá :)).

bạn có thể tải lại trang và bỏ qua bộ nhớ cache (trên Firefox) bằng cách sử dụng CTRL- SHIFT- Rvà bạn sẽ thấy giá trị kiểm tra không mang theo (bình thường CTRL- Rsẽ lấy thông tin từ bộ nhớ cache)

chỉnh sửa : Tôi đã có thể tắt phía máy chủ này trên Firefox, đặt tiêu đề kiểm soát bộ nhớ cache:

Cache-Control: no-store

điều này dường như vô hiệu hóa tính năng "ghi nhớ giá trị biểu mẫu" của Firefox


Đúng, CTRL-SHIFT-R khiến các hộp kiểm được đặt lại. Có cách nào để ngăn điều này được lưu vào bộ nhớ đệm không?
Chỉ đọc

tôi không nghĩ vậy (ít nhất là không phải từ phía máy chủ). firefox thực sự rất tích cực trong việc lưu trữ mọi thứ. Tôi đã chỉ có thể làm cho nó dừng bộ nhớ đệm đáng tin cậy trong những tình huống như thế này từ phía khách hàng
Owen

2
nó lấy các giá trị từ bộ nhớ đệm, do đó nó được lưu vào bộ nhớ đệm. trừ khi tôi đã hiểu sai những gì bạn đang cố gắng nói.
Owen

1
Bộ nhớ đệm tích cực của Firefox là một PITA chính và luôn giúp tôi chú ý khi phát triển chống lại nó. Tôi chưa thử tiêu đề Cache-Control trước đây nhưng nếu nó hoạt động stackoverflow thì chỉ cần tôi dành toàn bộ thời gian ở đây.
Cruachan

1
Các giá trị không đến từ “bộ nhớ đệm” như trong kho tệp đã tải xuống của Firefox. ví dụ: Nếu bạn điều hướng đi và sau đó theo cùng một URL, trang được lưu vào bộ nhớ cache nhưng các giá trị sẽ không có. Bằng cách phá vỡ bộ nhớ cache, bạn có thể buộc tải lại cứng, nhưng chỉ ngẫu nhiên là điều này cũng vô hiệu hóa tính năng.
bobince

164

Thêm autocomplete="off"vào phần tử biểu mẫu trên trang. Nhược điểm là đây không phải là XHTML hợp lệ, nhưng nó khắc phục sự cố mà không cần bất kỳ javascript phức tạp nào.


1
Hoạt động đối với tôi, trong đó tiêu đề kiểm soát bộ nhớ cache không hoạt động.
Lajos Meszaros

7
Từ những gì tôi đang đọc , nó thực sự có giá trị trong HTML5. (Tôi đã ủng hộ nhận xét trước đó trước khi đọc thêm về chủ đề này.) Vì vậy, hãy sử dụng tính năng tự động hoàn thành nội dung trái tim của bạn trên các hộp kiểm nếu bạn đang sử dụng HTML5.
EF0

2
Hơn 10 năm sau. Câu trả lời này đã giúp tôi đỡ đau đầu!
Daan van den Bergh

33

set autocomplete = "off" với js cũng hoạt động tốt.

ví dụ sử dụng jquery:

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

Cảm ơn, điều đó đã giúp tôi rất nhiều. :)
Lyubomyr Shaydariv

1
Tôi thấy rằng bạn cần $("#formId").attr("autocomplete", "off")nơi #formIdlà id của mẫu của bạn.
Dan Diplo

@DanDiplo có nhiều trường hợp chúng tôi sử dụng hộp kiểm không có biểu mẫu do đó nó không hợp lý để áp dụng ("#formId"). Attr ("autocomplete", "off")
Clain Dsilva

2
@ClainDsilva Chỉ vì bạn có thể sử dụng hộp kiểm bên ngoài biểu mẫu không có nghĩa là bất cứ điều gì tôi đã nói là phi logic. Bạn có thể khẳng định nó không hoàn toàn toàn diện (mặc dù nó hoạt động với hầu hết các tình huống) nhưng nói rằng nó không logic thì thật kỳ lạ khi nó hoạt động.
Dan Diplo

@DanDiplo khi chúng tôi có thể áp dụng tự động hoàn thành chỉ trên hộp kiểm, theo cách đó, giải pháp của bạn hoạt động tốt, tôi đồng ý rằng giải pháp của bạn hoạt động nhưng nó cũng áp dụng trên tất cả các phần tử trong hộp biểu mẫu. Tuy nhiên, đó có thể không phải là hành vi dự kiến. Câu hỏi được thu hẹp thành hộp kiểm đơn lẻ chứ không phải toàn bộ biểu mẫu. Với tất cả sự tôn trọng, tôi chỉ muốn tìm ra giải pháp tốt nhất phù hợp với câu hỏi. Trong bối cảnh này, việc tắt tính năng tự động điền cho toàn bộ biểu mẫu là không đúng.
Clain Dsilva,

1

Đó là một tính năng tuyệt vời của Firefox: nếu bạn nhập nội dung nào đó nhưng tải lại trang, văn bản vẫn nằm trong vùng văn bản. Idem cho các cài đặt khác mà bạn đã chọn.

Than ôi, nó không hoạt động trong SO (có thể được đặt lại bởi JS) và các trình duyệt dumber như IE ...

Đề xuất một giải pháp: nếu bạn thực sự cần làm điều đó, hãy đặt lại biểu mẫu bằng JS. form.reset () có thể thực hiện công việc (hoạt động giống như nút đầu vào Đặt lại).


1
Có vẻ hơi hacky, hoặc giống như bắn một con chim sẻ bằng đại bác.
Lajos Meszaros

@ MészárosLajos Hacky / overkill là gì, và tại sao bạn lại thấy nó như vậy? Bạn có thấy điều gì đơn giản hơn không?
PhiLho

Điều gì sẽ xảy ra nếu bạn chỉ muốn biểu mẫu được đặt lại? Cá nhân tôi, chỉ muốn vô hiệu hóa bộ đệm đầu vào cho các hộp kiểm, nhưng không cho các trường văn bản. Tôi hoàn toàn đồng ý với bạn, rằng đây là một tính năng tốt của firefox, nhưng không phải đối với hai nút trạng thái tùy chỉnh, về cơ bản là các hộp kiểm được thiết kế lại. Một điều nữa là, tại sao lại sử dụng javascript, nơi bạn có thể đơn giản sử dụng thuộc tính html để ngăn chặn hành vi này? Và vâng, tôi biết, "autocomplete = off" làm cho mã html không hợp lệ, nhưng trang vẫn hoạt động.
Lajos Meszaros

3
"đó là một tính năng tuyệt vời của Firefox": nếu bạn nhấp vào hộp kiểm lọc trên trang kết quả tìm kiếm và sau đó tải lại nó, các bộ lọc đã chọn sẽ không có ý nghĩa gì với tập dữ liệu được hiển thị. -tôi nói đây là một PITA chính như đã nói trước đây.
Sharky

Tôi sẽ không bao giờ gọi đây là một tính năng hay ... vâng, nó sẽ hữu ích khi bạn đang gõ nhiều văn bản và sau đó cần làm mới trang, nhưng nếu bạn đang phát triển giao diện người dùng, nó không tốt lắm đặc tính.
userfuser

1

Đây là một câu hỏi cũ nhưng vẫn còn là một vấn đề hoạt động cho firefox. Không có câu trả lời nào mà tôi đã thử giải quyết được nó, nhưng những gì đã giải quyết nó cho tôi chỉ đơn giản là:

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

Điều này chỉ đơn giản là đặt lại biểu mẫu về các tùy chọn mặc định mỗi khi tải trang. Không lý tưởng vì bạn mất kiểm soát chi tiết, nhưng đó là điều duy nhất giải quyết được điều này cho tôi.


0

hoặc thay vì f5, nhấn enter trên thanh địa chỉ :)


1
Hoặc đề xuất cho người dùng làm điều đó, đúng hơn (đây là câu hỏi của nhà phát triển).
Ông TA

Chúng tôi thực sự không thể mong đợi người dùng luôn làm mới trang bằng Crtl + Shift + R, phải không?
Lajos Meszaros

0

Đó có thể là do bộ nhớ đệm của trình duyệt - rất hữu ích cho các trang web tĩnh không được thay đổi quá thường xuyên, rất không tốt cho các ứng dụng web động.
Hãy thử với hai thẻ meta đó trong phần đầu của trang. Thẻ meta thứ hai dành cho các trình duyệt cũ hơn (IE5) không nhận dạng được thẻ meta "no-cache" và mặc dù khác nhau nhưng lại tạo ra cùng một kết quả: Mỗi yêu cầu sẽ được chuyển đến máy chủ.

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

Chúng ta có thực sự quan tâm đến các trình duyệt cũ như IE5 không? Bằng cách này, gửi các tiêu đề với PHP có vẻ hơi tốt hơn, bởi vì bạn sử dụng thẻ meta ít trong phần <head>
Lajos Mészáros

2
Câu trả lời của anh ấy là vào năm 2008, bình luận của @ MészárosLajos là vào năm 2014. Vào thời điểm đó, vâng, nó đã thành vấn đề.
Duniyadnd


0

ý tưởng công khai để giải quyết điều đó

tạo biểu mẫu và nút đặt lại

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

$(reset).trigger("click");//to clear the cache and input 
$(checkbox).trigger("click");//to mark checkbox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.