Cập nhật thanh địa chỉ bằng URL mới mà không cần băm hoặc tải lại trang


644

Tôi mơ ước về chrome (kênh dev) thực hiện cách cập nhật thanh địa chỉ thông qua javascript (đường dẫn, không phải tên miền) mà không tải lại trang hoặc họ thực sự đã làm điều này.

Tuy nhiên, tôi không thể tìm thấy bài báo tôi nghĩ rằng tôi đã đọc.

Tôi có điên không hay có cách nào để làm điều này (trong Chrome) không?

ps Tôi không nói về window.location.hash, et al. Nếu ở trên tồn tại câu trả lời cho câu hỏi này sẽ không đúng sự thật.



1
@tobiaskienzler Khi câu hỏi đó ban đầu được hỏi lại vào năm 2009, điều đó là không thể.
David Murdoch

3
Dĩ nhiên là không. Nhưng bây giờ, các câu hỏi yêu cầu như nhau. Một sự xấu hổ mặc dù người kia có một câu trả lời lỗi thời được chấp nhận (bởi bạn, tôi nhận thấy) ... Bạn biết gì không? Hãy đóng lại theo cách khác, không ai nói "bản gốc" phải là bản cũ hơn, thực tế đã có tiền lệ
Tobias Kienzler

@tobiaskienzler, câu hỏi khác không có câu trả lời được chấp nhận lỗi thời.
David Murdoch

2
@TobiasKienzler đó là một câu hỏi 6 năm tuổi, tại sao bạn phải bận tâm với câu hỏi này? Chỉ cần tận hưởng câu trả lời tuyệt vời và thực hiện nó trên ứng dụng của bạn. Trong 6 năm, hàng ngàn người dùng SO đã đồng ý rằng đó là một câu hỏi tuyệt vời, vui lòng để nguyên như vậy.
Imam Assidiqqi

Câu trả lời:


875

Bây giờ bạn có thể làm điều này trong hầu hết các trình duyệt "hiện đại"!

Đây là bài viết gốc tôi đã đọc (đăng ngày 10 tháng 7 năm 2010): HTML5: Thay đổi URL trình duyệt mà không cần làm mới trang .

Để có cái nhìn sâu hơn về PushState / thay thếState / popstate (còn gọi là API Lịch sử HTML5), hãy xem các tài liệu MDN .

TL; DR, bạn có thể làm điều này:

window.history.pushState("object or string", "Title", "/new-url");

Xem câu trả lời của tôi để Sửa đổi URL mà không cần tải lại trang để biết cách thực hiện cơ bản.


3
À, chức năng này có trong WebKit và đã hạ cánh vài tháng trước < bug.webkit.org/show_orms.cgi?id=36152 >. Đẹp tìm thấy!
oldlivingboy

6
cái này hiện được github sử dụng, trong khi điều hướng cây
Valerij

1
@Vprimachenko: Yup. Và họ phá vỡ nút quay lại của tôi mỗi lần trong một thời gian.
David Murdoch

Điều này hiện có thể được thực hiện trong Chrome, Safari, FF4 + và IE10pp3 +! (Từ câu trả lời của David Murdoch đến stackoverflow.com/questions/824349/iêu )
Zach Lysobey

11
Protip: bạn cũng có thể sử dụng các đường dẫn tương đối với các chức năng này (ví dụ ../new-urlhoặc ../../new-url. Chúng dường như làm những gì bạn mong đợi trong Chrome ít nhất.
Mahn

156

Chỉ thay đổi những gì sau khi băm - trình duyệt cũ

document.location.hash = 'lookAtMeNow';

Thay đổi URL đầy đủ. Chrome, Firefox, IE10 +

history.pushState('data to be passed', 'Title of the page', '/test');

Ở trên sẽ thêm một mục mới vào lịch sử để bạn có thể nhấn nút Quay lại để đi đến trạng thái trước đó. Để thay đổi URL tại chỗ mà không cần thêm mục nhập mới vào lịch sử, hãy sử dụng

history.replaceState('data to be passed', 'Title of the page', '/test');

Hãy thử chạy chúng trong giao diện điều khiển ngay bây giờ!


13
replaceStatelà chính xác những gì tôi cần, cảm ơn vì đã mở rộng phản ứng ban đầu.
Choylton B. Higginbottom

'tên miền và giao thức phải giống như bản gốc!' điều này ngăn một số trang web câu cá thay đổi url thanh địa chỉ.
Rick

3
Bạn không nên chuyển một URL tuyệt đối cho chức năng này. Nếu bạn làm như vậy, rất có thể bạn cần xây dựng nó một cách linh hoạt từ lược đồ, máy chủ và cổng hiện tại - đó là rất nhiều công việc khi bạn có thể biến nó thành một URL tương đối ("foo.html" hoặc thậm chí "/foo.html ") Và để trình duyệt chăm sóc nó.
DimeCadmium

1
@DimeCadmium đơn giản hóa tốt đẹp. Cập nhật.
Pawel

history.replaceStatethêm vào lịch sử trong ff 66.0b1
azzamsa

33

Cập nhật lên câu trả lời của Davids để thậm chí phát hiện các trình duyệt không hỗ trợ Pushstate:

if (history.pushState) {
  window.history.pushState("object or string", "Title", "/new-url");
} else {
  document.location.href = "/new-url";
}

9
document.location.href tải lại trang
paullb

1
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState({path:newurl},'',newurl);

3
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
MaxiMouse ngày

@MaxiMouse cảm ơn vì sự có đường của bạn, tôi sẽ ghi nhớ điều đó.
Kevin Mendez
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.