TL; DR
1- Để sửa đổi URL hiện tại và thêm / bơm nó (URL sửa đổi mới) như một mục URL mới vào danh sách lịch sử, sử dụng pushState
:
window.history.pushState({}, document.title, "/" + "my-new-url.html");
2- Để thay thế URL hiện tại mà không cần thêm nó vào các mục lịch sử, hãy sử dụng replaceState
:
window.history.replaceState({}, document.title, "/" + "my-new-url.html");
3- Tùy thuộc vào logic kinh doanh của bạn , pushState
sẽ hữu ích trong các trường hợp như:
bạn muốn hỗ trợ nút quay lại của trình duyệt
bạn muốn tạo một URL mới , thêm / chèn / đẩy URL mới vào các mục lịch sử và làm cho URL hiện tại
cho phép người dùng đánh dấu trang với cùng tham số (để hiển thị cùng nội dung)
để lập trình truy cập các dữ liệu thông qua stateObj
sau đó phân tích từ neo
Theo tôi hiểu từ nhận xét của bạn, bạn muốn xóa URL của mình mà không cần chuyển hướng nữa.
Lưu ý rằng bạn không thể thay đổi toàn bộ URL. Bạn chỉ có thể thay đổi những gì xuất hiện sau tên miền. Điều này có nghĩa là bạn không thể thay đổi www.example.com/
nhưng bạn có thể thay đổi những gì đến sau.com/
www.example.com/old-page-name => can become => www.example.com/myNewPaage20180322.php
Lý lịch
Chúng tôi có thể sử dụng:
1- Phương thức PushState () nếu bạn muốn thêm một URL được sửa đổi mới vào các mục lịch sử.
2- Phương thức thay thế () nếu bạn muốn cập nhật / thay thế mục lịch sử hiện tại .
.replaceState()
hoạt động chính xác như .pushState()
ngoại trừ việc .replaceState()
sửa đổi mục lịch sử hiện tại thay vì tạo một mục mới. Lưu ý rằng điều này không ngăn cản việc tạo một mục mới trong lịch sử trình duyệt toàn cầu.
.replaceState()
đặc biệt hữu ích khi bạn muốn cập nhật đối tượng trạng thái hoặc URL của mục lịch sử hiện tại để đáp ứng với một số hành động của người dùng.
Mã
Để làm điều đó tôi sẽ sử dụng phương thức PushState () cho ví dụ này hoạt động tương tự như định dạng sau:
var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );
Cảm thấy tự do để thay thế pushState
với replaceState
dựa trên yêu cầu của bạn.
Bạn có thể thay thế các paramter "object or string"
với {}
và "Title"
với document.title
nên Statment cuối cùng sẽ trở thành:
window.history.pushState({}, document.title, "/" + myNewURL );
Các kết quả
Hai dòng mã trước sẽ tạo một URL như:
https://domain.tld/some/randome/url/which/will/be/deleted/
Để trở thành:
https://domain.tld/my-new-url.php
Hoạt động
Bây giờ hãy thử một cách tiếp cận khác. Nói rằng bạn cần giữ tên của tập tin. Tên tệp xuất hiện sau cuối cùng /
và trước chuỗi truy vấn ?
.
http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john
Sẽ là:
http://www.someDomain.com/keepThisLastOne.php
Một cái gì đó như thế này sẽ làm cho nó hoạt động:
//fetch new URL
//refineURL() gives you the freedom to alter the URL string based on your needs.
var myNewURL = refineURL();
//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced.
window.history.pushState("object or string", "Title", "/" + myNewURL );
//Helper function to extract the URL between the last '/' and before '?'
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php'
//pseudo code: edit to match your URL settings
function refineURL()
{
//get full URL
var currURL= window.location.href; //get current address
//Get the URL between what's after '/' and befor '?'
//1- get URL after'/'
var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
//2- get the part before '?'
var beforeQueryString= afterDomain.split("?")[0];
return beforeQueryString;
}
CẬP NHẬT:
Đối với một người hâm mộ lót, hãy thử điều này trong bảng điều khiển / con bọ lửa của bạn và URL trang này sẽ thay đổi:
window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);
URL trang này sẽ thay đổi từ:
http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103
Đến
http://stackoverflow.com/22753103#22753103
Lưu ý: như Samuel Liew đã chỉ ra trong các bình luận bên dưới, tính năng này chỉ được giới thiệu cho HTML5
.
Một cách tiếp cận khác là thực sự chuyển hướng trang của bạn (nhưng bạn sẽ mất chuỗi truy vấn `? ', Nó vẫn cần thiết hay dữ liệu đã được xử lý?).
window.location.href = window.location.href.split("?")[0]; //"http://www.newurl.com";