Làm cách nào để buộc tải lại một trang khi sử dụng nút quay lại của trình duyệt?


84

Tôi cần phát hiện bằng cách nào đó rằng người dùng đã nhấn nút quay lại của trình duyệt và tải lại trang bằng cách làm mới (tải lại nội dung và CSS) bằng jquery.

Làm thế nào để phát hiện hành động đó thông qua jquery?

Bởi vì ngay bây giờ một số phần tử không được tải lại nếu tôi sử dụng nút quay lại trong trình duyệt. Nhưng nếu tôi sử dụng các liên kết trong trang web thì mọi thứ đều được làm mới và hiển thị chính xác.

QUAN TRỌNG!

Một số người có lẽ đã hiểu sai những gì tôi muốn. Tôi không muốn làm mới trang hiện tại. Tôi muốn làm mới trang được tải sau khi nhấn nút quay lại. đây là ý tôi nói một cách chi tiết hơn:

  1. người dùng đang truy cập trang1.
  2. khi đang ở trang1 - anh ấy nhấp vào liên kết đến trang2.
  3. anh ấy được chuyển hướng đến trang2
  4. bây giờ (Phần quan trọng!) anh ấy nhấp vào nút quay lại trong trình duyệt vì anh ấy muốn quay lại trang1
  5. anh ấy đã quay lại trang1 - và bây giờ trang1 đang được tải lại và có thông báo gì đó như "Bạn đã quay lại!"

Thay vì hack hành vi người dùng bình thường, tại sao bạn không thử hiểu tại sao mã của bạn không hoạt động khi tải trang và bạn cần trang tải lại?
Lelio Faieta

2
@LelioFaieta Tôi thay đổi lớp để hiển thị các thay đổi. Nếu người dùng nhấp vào thứ gì đó, giá trị sẽ thay đổi trong cơ sở dữ liệu thông qua ajax. Khi ajax được thực hiện xong, css class cahnge ví dụ từ onto off. Và không sao cả, nó được lưu trong db, người dùng xem mọi thứ chính xác. Bây giờ anh ta nhấp vào một số liên kết khác. Ví dụ về trang chúng tôi, phải không? Bây giờ, anh ấy đang ở trên trang về chúng tôi. Be quyết định quay lại trang trước và nhấp vào nút quay lại trong trình duyệt. Và khi anh trở lại, ông thấy những thay đổi trên các trang như là trình duyệt cho thấy trang (có thể là một số cahing trình duyệt) trước khi ông triggerd các ajax (on / off lớp)
John Doeherskij

1
Bạn có đang sử dụng get hoặc post cho cuộc gọi Ajax của mình không?
Lelio Faieta

1
@LelioFaieta part2 .. Tôi cũng sử dụng thuộc tính dữ liệu và nó không có tác dụng. Mọi thứ sẽ tuyệt vời nếu trang được tải lại. Nếu tôi nhấn F5 trên trang đó, các giá trị mà anh ấy đã thay đổi qua ajax được hiển thị. Tôi nghĩ rằng đây là một số vấn đề liên quan đến bộ đệm trình duyệt, khi phần css / html không được tải lại hoàn toàn. Nó tải lại chỉ sau khi nhấn f5
John Doeherskij

@LelioFaieta $.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })Bạn có nghĩ rằng điều này có thể là do ajax? nó sẽ là tuyệt vời nếu đây là trường hợp.
John Doeherskij

Câu trả lời:


86

Bạn có thể sử dụng pageshowsự kiện để xử lý tình huống khi trình duyệt điều hướng đến trang của bạn thông qua truyền qua lịch sử:

window.addEventListener( "pageshow", function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != "undefined" && 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});

Lưu ý rằng bộ nhớ cache HTTP cũng có thể liên quan. Bạn cần đặt tiêu đề HTTP có liên quan đến bộ đệm thích hợp trên máy chủ để chỉ lưu vào bộ đệm những tài nguyên cần được lưu vào bộ đệm. Bạn cũng có thể làm tải lại buộc phải trình duyệt instuct bỏ qua HTTP cache: window.location.reload( true ). Nhưng tôi không nghĩ rằng đó là giải pháp tốt nhất.

Để biết thêm thông tin, hãy kiểm tra:


Bạn có thể giúp người dùng Dhiraj anh ta đang đi đúng hướng nhưng nó đang tải lại hai lần. Bằng cách này, tôi đã cố gắng window.addEventListener( "unload", function() {} );nhưng nó không làm gì cả, các công trình nút quay lại như trước đây, không có thay đổi nào; (
John Doeherskij

Làm thế nào để dỡ bỏ BFCache? Bạn có thể cập nhật mã của mình với thông tin cụ thể hơn không? Dòng window.addEventListener( "unload", function() {} );này không hoạt động. Nó đã hoàn thành chưa?
John Doeherskij

Duyệt qua lịch sử Chrome hơi khó hiểu. Hãy thử pageshowgiải pháp.
Leonid Vasilev

1
Tôi vẫn thấy tải hai lần; (Sau khi Firefox mặc định (hiển thị trang cũ; có lẽ từ bộ nhớ cache của trình duyệt?) Và sau đó tập lệnh kích hoạt lại. Tập lệnh sẽ tải lại nó về vùng thực tế, nhưng tôi vẫn thấy trạng thái cũ trong một giây hoặc lâu hơn; (tôi có bên trong mã$(document).ready( function() { /* code here */ });
John Doeherskij

3
window.performance.navigationkhông được dùng nữa. Để kiểm tra loại điều hướng tôi đã sử dụngwindow.performance.getEntriesByType("navigation")[0].type === "back_forward"
zero01alpha

49

Đã lâu kể từ khi điều này được đăng nhưng tôi đã tìm thấy một giải pháp thanh lịch hơn nếu bạn không cần hỗ trợ các trình duyệt cũ.

Bạn có thể kiểm tra với

performance.navigation.type

Tài liệu bao gồm hỗ trợ trình duyệt có tại đây: https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

Vì vậy, để xem liệu trang có được tải từ lịch sử hay không, bạn có thể làm

if(performance.navigation.type == 2){
   location.reload(true);
}

Biểu tượng 2cho biết trang đã được truy cập bằng cách điều hướng vào lịch sử. Các khả năng khác là-

0:Trang được truy cập bằng cách nhấp vào liên kết, dấu trang, gửi biểu mẫu hoặc tập lệnh hoặc bằng cách nhập URL vào thanh địa chỉ.

1:Trang được truy cập bằng cách nhấp vào nút Tải lại hoặc thông qua phương thức Location.reload ().

255: Bất kỳ cách nào khác

Thông tin chi tiết tại đây: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation


Lưu ý Performance.navigation.type hiện không được dùng nữa để thay thế cho PerformanceNavigationTiming.type , trả về 'điều hướng' / 'tải lại' / 'back_osystem' / 'Pre -veloper': https://developer.mozilla.org/en-US/docs/Web / API / PerformanceNavigationTiming / type


2
Kiểm tra này làm việc cho tôi. Chính xác thì 2 nghĩa là gì?
RitchieD

Điều này hoạt động như một sự quyến rũ .. Tôi đã đặt nó ở trên cùng hầu hết khu vực .. và trang đang tải lại mà không tải bất kỳ tập lệnh nào khác.
NMathur

Điều này hoạt động như một sự quyến rũ. Tìm thấy tuyệt vời ... Nó rất nhanh và đáng tin cậy không giống như các câu trả lời khác chậm so với câu trả lời này. TY
weBBer

cái này làm việc với chrome trình duyệt và đã làm không phải với firefox
praaveen VR

7
Tính năng này không được dùng nữa (xem w3c.github.io/navigation-timing/#obsolete ).
David Vielhuber,

22

Chỉ cần sử dụng jquery:

jQuery( document ).ready(function( $ ) {

   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
      location.reload(true);
   });

});

Ở trên sẽ hoạt động 100% khi nút quay lại hoặc chuyển tiếp được nhấp bằng ajax.

nếu không, phải có cấu hình sai trong một phần khác của tập lệnh.

Ví dụ: nó có thể không tải lại nếu một cái gì đó giống như một trong những ví dụ trong bài trước được sử dụng window.history.pushState('', null, './');

vì vậy khi bạn sử dụng history.pushState(); hãy chắc chắn rằng bạn sử dụng nó đúng cách.

Đề xuất trong hầu hết các trường hợp, bạn sẽ chỉ cần:

history.pushState(url, '', url); 

Không có window.history ... và đảm bảo rằng url được xác định.

Hy vọng rằng sẽ giúp ..


Điều này KHÔNG hoạt động trong IE. developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
RitchieD

@RitchieD - Tính đến hôm nay, tính năng này hoạt động tốt trong IE11 trên Windows 10. Lưu ý: Tôi không sử dụng EDGE.
Dan G

Chỉ cần không phải là một fan hâm mộ của "chỉ cần sử dụng jQuery" câu trả lời, xin lỗi
Steven

Tôi sẽ xóa "true" khỏi tải lại để sử dụng bộ đệm HTTP. Không có điểm nào để tải lại nội dung cho hầu hết các trường hợp.
konyak

14

performance.navigationhiện không được dùng nữa, bạn có thể thử cách này:

var perfEntries = performance.getEntriesByType("navigation");

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}

Đây là câu trả lời cập nhật nhất
Java_Man

Mã này cần được kết hợp với mã trong câu trả lời của Leonid ở trên.
gornvix

Điều này đang làm việc tốt cho tôi. Tôi đã thử nghiệm trên Chrome, Firefox, IE và Edge mới nhất. Không kiểm tra Safari trên Mac.
Tasawar Hussain

6

Bạn nên sử dụng đầu vào ẩn làm chỉ báo làm mới, với giá trị là "không":

<input type="hidden" id="refresh" value="no">

Bây giờ sử dụng jQuery, bạn có thể kiểm tra giá trị của nó:

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

Khi bạn nhấp vào nút quay lại, các giá trị trong các trường ẩn vẫn giữ nguyên giá trị như khi bạn rời trang ban đầu.

Vì vậy, lần đầu tiên bạn tải trang, giá trị của đầu vào sẽ là "không". Khi bạn quay lại trang, nó sẽ là "có" và mã JavaScript của bạn sẽ kích hoạt làm mới.


1
Nó không hoạt động. Tôi đã thử Firefox và Chrome nhưng nó không hoạt động.
John Doeherskij

Vui lòng kiểm tra câu hỏi cập nhật của tôi, có lẽ bạn và những người khác đã hiểu sai về tôi. Bây giờ nó rõ ràng hơn nhiều, những gì tôi muốn đạt được. Cảm ơn bạn.
John Doeherskij

Vâng, tôi đã hiểu sai, Cảm ơn bạn đã cập nhật câu hỏi chi tiết.
Dhiraj

bây giờ nó hoạt động. Tuy nhiên nó tải lại 2 lần và nó trông hơi kỳ lạ. Lần đầu tiên nó tải lại. không có gì - đây có thể là hành vi trình duyệt mặc định. Lần thứ hai nó tải lại - thông qua tập lệnh của bạn - các giá trị được làm mới như bình thường, nhưng có vẻ tệ, vì nó tải lại hai lần. Bất kỳ ý tưởng nào về cách cải thiện nó một chút để tải lại trông đẹp hơn hay chỉ tải lại một lần? Trong Chrome có vẻ đẹp hơn Firefox, tải lại nhanh hơn, nhưng tôi vẫn thấy trạng thái quay lại ban đầu (trong một giây hoặc nửa giây) và việc tải lại tập lệnh chỉ diễn ra sau đó.
John Doeherskij

Bất kỳ ý tưởng mới làm thế nào để sửa chữa "tải kép"?
John Doeherskij

6

Một giải pháp thay thế đã giải quyết được vấn đề đối với tôi là tắt bộ nhớ cache cho trang. Điều đó làm cho trình duyệt lấy trang từ máy chủ thay vì sử dụng phiên bản được lưu trong bộ nhớ cache:

Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

Giải pháp tốt nhất, nhưng đây là phiên bản mà tôi đã sử dụng. Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetMaxAge(TimeSpan.Zero); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); Response.Cache.SetNoStore();
zeal

2

Hiện tại đây là cách tải lại trang cập nhật nhất nếu người dùng nhấp vào nút quay lại.

const [entry] = performance.getEntriesByType("navigation");

// Show it in a nice table in the developer console
console.table(entry.toJSON());

if (entry["type"] === "back_forward")
    location.reload();

Xem tại đây để biết nguồn


1

Tải lại rất dễ dàng. Bạn nên sử dụng:

location.reload(true);

Và phát hiện trở lại là:

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});

Không hoạt động; (Tôi đã thử alert('test');thay vì location.reload(true);nhưng vẫn không có gì. Tôi đã thử firefox và chrome nhưng không có gì. Tôi đã thử tài liệu bên trong sẵn sàng, bên ngoài, nhưng không có gì hoạt động. Nếu tôi thử đơn giản alert () hoặc bất kỳ mã jquery nào hoạt động. Tôi có rất nhiều mã jquery trên trang của mình và nó hoạt động.
John Doeherskij

Tôi đã chỉnh sửa câu trả lời, hãy thử giải pháp mới. Điều này là bạn cần phải đẩy trạng thái trước đó, nếu không bạn sẽ không nhận được sự kiện popstate.
Anton Stepanenkov

Bạn có thể đã hiểu lầm whan tôi muốn. Tôi đã cập nhật câu hỏi của mình với một mô tả chi tiết hơn. Vui lòng kiểm tra lại nếu bạn có thời gian, xin cảm ơn.
John Doeherskij

0

Sử dụng thẻ meta sau trong tệp tiêu đề html của bạn, Điều này phù hợp với tôi.

<meta http-equiv="Pragma" content="no-cache">

Đây không tải lại trang khi trở lại, mà OP yêu cầu
Timberman

-1

Tôi đã tìm thấy câu trả lời tốt nhất và nó đang hoạt động hoàn hảo cho tôi

chỉ cần sử dụng tập lệnh đơn giản này trong liên kết của bạn

<A HREF="javascript:history.go(0)">next page</A>

hoặc sự kiện nhấp vào nút

<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">

khi bạn sử dụng điều này, bạn làm mới trang của mình trước rồi chuyển sang trang tiếp theo, khi bạn quay lại, nó sẽ có trạng thái được làm mới lần cuối.

Tôi đã sử dụng nó khi đăng nhập CAS và cung cấp cho tôi những gì tôi muốn. Hy vọng nó giúp .......

chi tiết tìm thấy từ đây


Điều này không làm việc cho tôi. Số "0" đại diện cho điều gì?
Vincent
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.