Sự khác biệt giữa window.location = và window.location.replace () là gì?


273

Có sự khác biệt giữa hai dòng này?

var url = "http://www.google.com/";
window.location = url;
window.location.replace(url);

3
Tôi cũng đã giải thích điều này ở đây: stackoverflow.com/questions/846954/ từ
Mathias Bynens

Câu trả lời:


408

window.location thêm một mục vào lịch sử của bạn để bạn có thể (hoặc có thể) nhấp vào "Quay lại" và quay lại trang hiện tại.

window.location.replace thay thế mục lịch sử hiện tại để bạn không thể quay lại mục đó.

Xem window.location:

assign(url): Tải tài liệu tại URL được cung cấp.

replace(url): Thay thế tài liệu hiện tại bằng tài liệu tại URL được cung cấp. Sự khác biệt so với assign()phương pháp là sau khi sử dụng replace()trang hiện tại sẽ không được lưu trong lịch sử phiên, nghĩa là người dùng sẽ không thể sử dụng nút Quay lại để điều hướng đến trang đó.

Ồ và nói chung:

window.location.href = url;

được ưa chuộng hơn:

window.location = url;

52
Tại sao sẽ window.location.hrefđược ưa chuộng hơn window.location?
Mathias Bynens

13

1
Câu hỏi - Nếu tôi sử dụng window.location.replace(URL)URL giống hệt như URL hiện tại, tôi có thể mong đợi nó làm mới / tải lại không hoặc nó có tùy chọn không làm gì không?
dùng9645

11

TLDR;

sử dụng location.hrefhoặc sử dụng tốt hơn window.location.href;

Tuy nhiên nếu bạn đọc điều này, bạn sẽ đạt được bằng chứng không thể phủ nhận.

Sự thật là nó tốt để sử dụng nhưng tại sao làm những điều đáng nghi ngờ. Bạn nên đi đường cao hơn và chỉ cần làm theo cách mà nó có thể nên được thực hiện.

location = "#/mypath/otherside"
var sections = location.split('/')

Mã này là hoàn toàn chính xác cú pháp khôn ngoan, logic khôn ngoan, loại khôn ngoan bạn biết điều duy nhất sai với nó?

nó có locationthay vìlocation.href

cái này thì sao

var mystring = location = "#/some/spa/route"

giá trị của là mystringgì? Có ai thực sự biết mà không làm một số thử nghiệm. Không ai biết chính xác những gì sẽ xảy ra ở đây. Địa ngục tôi chỉ viết cái này và tôi thậm chí không biết nó làm gì. locationlà một đối tượng nhưng tôi đang gán một chuỗi nó sẽ truyền chuỗi hoặc truyền đối tượng vị trí. Hãy nói rằng có một số câu trả lời cho việc này nên được thực hiện như thế nào. Bạn có thể đảm bảo tất cả các trình duyệt sẽ làm điều tương tự?

Điều này tôi có thể đoán khá nhiều tất cả các trình duyệt sẽ xử lý như nhau.

var mystring = location.href = "#/some/spa/route"

Thế còn nếu bạn đặt cái này vào bản thảo thì nó sẽ bị hỏng vì trình biên dịch kiểu sẽ nói đây là giả sử là một đối tượng?

Tuy nhiên, cuộc trò chuyện này sâu sắc hơn nhiều so với chỉ locationđối tượng. Chuyển đổi này là gì về loại lập trình viên bạn muốn trở thành?

Nếu bạn thực hiện việc rút gọn này, hôm nay bạn có thể ổn, bạn có thể sẽ ổn vào ngày mai, địa ngục có thể sẽ ổn mãi mãi, nhưng bạn ạ bây giờ là một lập trình viên tồi. Nó sẽ không ổn cho bạn và nó sẽ làm bạn thất vọng.

Sẽ có nhiều đối tượng hơn. Sẽ có cú pháp mới.

Bạn có thể định nghĩa một getter chỉ mất một chuỗi nhưng trả về một đối tượng và điều tồi tệ nhất là bạn sẽ nghĩ rằng mình đang làm gì đó chính xác, bạn có thể nghĩ rằng bạn thật xuất sắc cho phương pháp thông minh này bởi vì mọi người ở đây đã xấu hổ dẫn bạn đi lạc đường.

var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"

Với getters và setters, mã này sẽ thực sự hoạt động, nhưng chỉ vì nó có thể được thực hiện không có nghĩa là 'WISE' để làm như vậy.

Hầu hết những người đang lập trình đều thích lập trình và thích làm tốt hơn. Trong vài năm qua tôi đã khá giỏi và học hỏi được nhiều điều. Điều quan trọng nhất tôi biết bây giờ đặc biệt là khi bạn viết Thư viện là tính nhất quán và dự đoán.

Làm những việc mà bạn luôn có thể làm.

+"2"<- điều này ngay tại đây phân tích chuỗi thành một số. bạn có nên sử dụng nó? hay bạn nên sử dụng parseInt("2")?

những gì về var num =+"2"?

Từ những gì bạn đã học được, từ những suy nghĩ của stackoverflow tôi không quá hy vọng.

Nếu bạn bắt đầu theo 2 từ này nhất quán và dự đoán. Bạn sẽ biết câu trả lời đúng cho hàng tấn câu hỏi trên stackoverflow.

Hãy để tôi chỉ cho bạn cách này trả hết. Thông thường tôi đặt ;trên mỗi dòng javascript tôi viết. Tôi biết nó biểu cảm hơn. Tôi biết nó rõ ràng hơn. Tôi đã tuân theo các quy tắc của tôi. Một ngày tôi quyết định không. Tại sao? Bởi vì rất nhiều người đang nói với tôi rằng nó không còn cần thiết nữa và JavaScript có thể làm mà không cần nó. Vì vậy, những gì tôi quyết định làm điều này. Bây giờ bởi vì tôi đã chắc chắn về bản thân mình với tư cách là một lập trình viên (vì bạn nên tận hưởng thành quả của việc thành thạo một ngôn ngữ), tôi đã viết một cái gì đó rất đơn giản và tôi đã không kiểm tra nó. Tôi đã xóa một dấu phẩy và tôi không nghĩ rằng mình cần kiểm tra lại một việc đơn giản như xóa một dấu phẩy.

Tôi đã viết một cái gì đó tương tự như thế này trong es6 và babel

var a = "hello world"
(async function(){
  //do work
})()

Mã này thất bại và mất mãi mãi để tìm ra. Vì một số lý do, những gì nó thấy là

var a = "hello world"(async function(){})()

ẩn sâu bên trong mã nguồn, nó nói với tôi "xin chào thế giới" không phải là một chức năng.

Đối với nút vui hơn không hiển thị bản đồ nguồn của mã được mã hóa.

Lãng phí quá nhiều thời gian ngu ngốc. Tôi đã trình bày với ai đó về việc ES6 tuyệt vời như thế nào và sau đó tôi phải bắt đầu gỡ lỗi và chứng minh ES6 không đau đầu và tốt hơn như thế nào. Không thuyết phục là nó.

Tôi hy vọng điều này đã trả lời câu hỏi của bạn. Đây là một câu hỏi cũ, nó dành cho thế hệ tương lai, những người vẫn đang học hỏi.

Câu hỏi khi mọi người nói nó không thành vấn đề theo cách nào. Cơ hội là một người khôn ngoan hơn nhiều kinh nghiệm sẽ cho bạn biết khôn ngoan khác.

Điều gì xảy ra nếu ai đó ghi đè lên đối tượng vị trí. Họ sẽ làm một shim cho các trình duyệt cũ hơn. Nó sẽ nhận được một số tính năng mới cần được làm sáng tỏ và mã 3 năm tuổi của bạn sẽ thất bại.

Lưu ý cuối cùng của tôi để suy ngẫm.

Viết mã rõ ràng, có mục đích rõ ràng sẽ làm điều gì đó cho mã của bạn không thể trả lời đúng hay sai. Những gì nó làm là nó làm cho mã của bạn trở thành một enabler.

Bạn có thể sử dụng nhiều plugin hơn, Thư viện mà không sợ bị gián đoạn giữa các mã.

cho hồ sơ. sử dụng

window.location.href


24
Câu trả lời dài thông tin, tranh luận sôi nổi. Nhưng khi tranh luận về việc sử dụng window.location.hrefhơn window.location, bạn đã quên câu hỏi đang thực sự hỏi về sự khác biệt giữa những điều này vàwindow.location.replace()
AntonChanning

10
Bất cứ khi nào tôi thấy TLDR, tôi mong đợi một câu trả lời SHORTER, không phải là câu trả lời dài hơn 5x.
dùng9645

3
TLDR; use location.href or better use window.location.href; TLDR là dòng này. Phần còn lại là "câu trả lời".
Elysiumplain

Tôi không nghĩ bạn tạo điểm hợp lệ bằng cách giới thiệu trường hợp sử dụng không phổ biến. tức mystring = location.href = "#/some/spa/route". Bên cạnh đó, nhiều ngôn ngữ sẽ cho phép (ngầm) loại diễn viên theo một cách nào đó. Vào cuối ngày, javascript là một ngôn ngữ được gõ động, đặt các khái niệm kiểu trên đó và nói rằng nó không tốt làm cho không có điểm nào nổi bật.
táo táo

1
Điều gì xảy ra nếu ai đó ghi đè lên đối tượng vị trí . tốt, giống như nói gì nếu ai đó ghi đè consolehoặc bóng window- Bây giờ bạn có một vấn đề lớn hơn .
táo táo
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.