Làm cách nào để thay đổi URL hiện tại?


100

Tôi có mã sau để thay đổi các trang từ bên trong JavaScript:

var newUrl = [some code to build up URL string];
window.location.replace(newUrl);

Nhưng nó không thay đổi URL trên cùng, vì vậy khi ai đó nhấp vào nút quay lại, nó sẽ không quay lại trang trước.

Làm cách nào để JavaScript thay đổi cả URL trên cùng để nút quay lại của trình duyệt hoạt động.

Câu trả lời:



38

Chỉ định đơn giản cho window.locationhoặc window.location.hrefnên ổn:

window.location = newUrl;

Tuy nhiên, URL mới của bạn sẽ khiến trình duyệt tải trang mới, nhưng có vẻ như bạn muốn sửa đổi URL mà không cần rời khỏi trang hiện tại. Bạn có hai lựa chọn cho việc này:

  1. Sử dụng hàm băm URL. Ví dụ, bạn có thể example.comchuyển đến example.com#foomà không cần tải một trang mới. Bạn chỉ cần thiết lập window.location.hashđể thực hiện điều này dễ dàng. Sau đó, bạn nên lắng nghe hashchangesự kiện HTML5 , sự kiện này sẽ được kích hoạt khi người dùng nhấn nút quay lại. Điều này không được hỗ trợ trong các phiên bản IE cũ hơn, nhưng hãy xem jQuery BBQ , công cụ này làm cho điều này hoạt động trên tất cả các trình duyệt.

  2. Bạn có thể sử dụng Lịch sử HTML5 để sửa đổi đường dẫn mà không cần tải lại trang. Điều này sẽ cho phép bạn thay đổi từ example.com/foosang example.com/bar. Sử dụng cái này rất dễ dàng:

    window.history.pushState("example.com/foo");

    Khi người dùng nhấn "back", bạn sẽ nhận được popstatesự kiện của cửa sổ mà bạn có thể dễ dàng nghe (jQuery):

    $(window).bind("popstate", function(e) { alert("location changed"); });

    Thật không may, điều này chỉ được hỗ trợ trong các trình duyệt rất hiện đại, như Chrome, Safari và Firefox 4 beta.


phương thức .replace trên các chuỗi sẽ không thay đổi chuỗi mà nó được áp dụng, nó sẽ tạo ra một chuỗi mới. " - window.location.replace()phương thức này không giống với String.prototype.replace()phương thức vì window.locationkhông phải là một chuỗi (nó là một đối tượng). window.location.replace()Thay thế hiện tại URL với một URL mới, trong khi ghi đè mục nhập của URL cũ trong lịch sử.
Andy E

1
Cảm ơn bạn đã chỉnh sửa, tôi sẽ cập nhật câu trả lời của mình cho phù hợp.
bcherry

2
Nhìn lại, đây là câu trả lời tốt nhất cho đến nay. document.location.href không có gì trên pushState
Buley

7

Hmm, tôi sẽ sử dụng

window.location = 'http://localhost/index.html#?options=go_here';

Tôi không chắc đó có phải là ý của bạn không.


7

Nếu bạn chỉ muốn cập nhật đường dẫn tương đối, bạn cũng có thể làm

window.location.pathname = '/relative-link'

"http://domain.com" -> "http://domain.com/relative-link"


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.