Sự khác biệt giữa window.location.href = window.location.href và window.location.reload ()


196

Sự khác biệt giữa JavaScript là gì

window.location.href = window.location.href

window.location.reload()

chức năng?

Câu trả lời:


247

Nếu tôi nhớ chính xác, hãy window.location.reload()tải lại trang hiện tại bằng dữ liệu POST, trong khi window.location.href=window.location.hrefkhông bao gồm dữ liệu POST.

Như được lưu ý bởi @ W3Max trong các bình luận bên dưới, window.location.href=window.location.hrefsẽ không tải lại trang nếu có một neo (#) trong URL - Bạn phải sử dụng window.location.reload()trong trường hợp này.

Ngoài ra, như được lưu ý bởi @Mic bên dưới, window.location.reload()sẽ có một đối số bổ sung skipCacheđể với việc sử dụng window.location.reload(true)trình duyệt sẽ bỏ qua bộ đệm và tải lại trang từ máy chủ. window.location.reload(false)sẽ làm ngược lại và tải trang từ bộ đệm nếu có thể.


11
lưu ý rằng khi bạn sử dụng window.location.reload () trên POST, trình duyệt sẽ hỏi bạn nếu bạn muốn gửi lại dữ liệu để tải lại trang
wimh

3
@Wimmel, có cách nào để vô hiệu hóa tin nhắn này không?
Kris-I

40
window.location.href = window.location.href sẽ không tải lại trang nếu có neo (#) trong URL - Bạn phải sử dụng window.location.reload () trong trường hợp này.
W3Max

5
Cũng lưu ý rằng location.reload () cũng sẽ buộc tải lại tất cả nội dung tĩnh (giống như làm mới cứng kiểu ctrl + f5) trong khi cài đặt location.href trở lại href (hoặc tên đường dẫn hoặc URL) không, có thể là một điều đáng kể (và không cần thiết) sự khác biệt về thời gian tải trên một số trang.
Rob Van Dam

2
@Wimmel Chrome: tải lại trang bằng GET Firefox: thực hiện lại yêu cầu trước đó, nghĩa là nếu đó là POST, bạn sẽ nhận được cửa sổ bật lên đẹp mắt hỏi bạn về việc có nên gửi lại dữ liệu hay không
Juri

51

Nếu bạn nói window.location.reload(true)trình duyệt sẽ bỏ qua bộ đệm và tải lại trang từ máy chủ. window.location.reload(false)sẽ làm ngược lại.

Lưu ý: defaultgiá trị cho window.location.reload()false


5
@Ismail - Mặc định là sai.
Trevor

2
Google Chrome 32, trong khi sử dụng webRTC, đúng / sai không hoạt động với tôi. Tôi đã có iframe với webRTC và chỉ sử dụng window.location.href = window.location.hrefđã thực hiện thủ thuật.

Nếu bạn đã thực hiện thay đổi đối với một biểu mẫu trên trang, các thay đổi có thể biến mất (trở lại giá trị được lưu trong bộ nhớ cache) tùy thuộc vào trình duyệt khi sử dụng location.reload()hoặc location.reload(false). Để làm mới hoàn toàn trang, sử dụng location.reload(true).
Suncat2000

32

Sự khác biệt là

window.location = document.URL;

sẽ không tải lại trang nếu có một hàm băm (#) trong URL (có hoặc không có cái gì đó sau nó), trong khi đó

window.location.reload();

sẽ tải lại trang.


2
Không phải tất cả các trình duyệt có vấn đề này với kết thúc. Nếu băm kết thúc là mối quan tâm của bạn, hãy thử: window.location = document.URL.replace (/ # $ /, '');
Walter Stabosz

1
Ít nhất Chrome có liên quan. Tôi đã từng location.href = location.hrefcho là điều hiển nhiên, nhưng tôi chỉ nhận thấy hành vi chính xác đó và đã đến SO để truyền bá. Chỉ cần sử dụng location.reload()thay thế.
Pioul

1
Bạn cũng có thể sử dụng window.location.pathname thay vì viết biểu thức thông thường như vậy. Ví dụ:window.location.replace(window.location.pathname);
Asen

20

Nếu bạn thêm boolean true vào tải lại, window.location.reload(true)nó sẽ tải từ máy chủ.

Không rõ mức độ được hỗ trợ của boolean này, W3Org đề cập rằng NS đã sử dụng để hỗ trợ

Có MIGHT có sự khác biệt giữa nội dung của window.location.href và document.URL - ít nhất được sử dụng để có sự khác biệt giữa location.href và tài liệu không chuẩn và không dùng nữa. Điều đó phải làm với chuyển hướng, nhưng điều đó thực sự là thiên niên kỷ qua.

Đối với mục đích tài liệu, tôi sẽ sử dụng window.location.reload () vì đó là những gì bạn muốn làm.


Nhìn vào stackoverflow.com/a/5091619/429972 vì điều này giải thích sự khác biệt.
jontro

14

Như đã nói, sửa đổi href khi có hàm băm (#) trong url sẽ không tải lại trang. Vì vậy, tôi sử dụng điều này để tải lại nó thay vì các biểu thức thông thường:

if (!window.location.hash) {
    window.location.href = window.location.href;
} else {
    window.location.reload();
}

6

Đi qua câu hỏi này để nghiên cứu một số hành vi khác thường trong IE, cụ thể là IE9, đã không kiểm tra các phiên bản cũ hơn. Dường như

window.location.reload();

dẫn đến việc làm mới làm trống toàn bộ màn hình trong một giây, trong đó như

 window.location = document.URL;

làm mới trang nhanh hơn nhiều, gần như không thể nhận ra.

Nghiên cứu thêm một chút và thử nghiệm với fiddler, dường như window.location.reload()sẽ bỏ qua bộ đệm và tải lại từ máy chủ bất kể bạn có vượt qua boolean với nó hay không, điều này bao gồm lấy tất cả tài sản của bạn (hình ảnh, tập lệnh, biểu định kiểu, v.v.) một lần nữa. Vì vậy, nếu bạn chỉ muốn trang làm mới HTML, window.location = document.URLnó sẽ trả về nhanh hơn nhiều và có ít lưu lượng truy cập hơn.

Một điểm khác biệt trong hành vi giữa các trình duyệt là khi IE9 sử dụng phương thức tải lại, nó sẽ xóa trang hiển thị và dường như xây dựng lại từ đầu, trong đó FF và chrome chờ cho đến khi chúng có được tài sản mới và xây dựng lại nếu chúng khác nhau.


window.location = document.URL tải lại trang giống như window.location.reload (). Có một trạng thái của nghệ thuật để làm mới mà không cuộn trở lại đầu trang, hoặc không thể nhận ra như bạn đã nói?
bigmugcup

6

Một điểm khác biệt trong Firefox (12.0) là trên một trang được hiển thị từ POST, tải lại () sẽ bật lên một cảnh báo và thực hiện đăng lại, trong khi việc gán URL sẽ thực hiện GET.

Google Chrome thực hiện NHẬN cho cả hai.


1
Chrome 38 hiện dường như sử dụng POST cho .reload ().
Glen Little

3

Sử dụng JSF, tôi hiện đang gặp sự cố với làm mới sau khi hết phiên: PrimeFaces ViewExpiredException sau khi tải lại trang và với một số điều tra tôi đã tìm thấy một điểm khác biệt trong FireFox:

Gọi window.location.reload()hoạt động như nhấp vào biểu tượng làm mới trên FF, nó thêm dòng

Cache-Control max-age=0

trong khi cài đặt window.location.hrefhoạt động như nhấn ENTER trong dòng URL, nó không gửi dòng đó.

Mặc dù cả hai đều được gửi dưới dạng GET, nhưng lần đầu tiên (tải lại) đang khôi phục dữ liệu trước đó và ứng dụng ở trạng thái không nhất quán.


1

Không, không nên có. Tuy nhiên, có thể có sự khác biệt trong một số trình duyệt, vì vậy một trong hai trường hợp có thể không hoạt động.


1

từ kinh nghiệm khoảng 3 năm của tôi, tôi không thể tìm thấy sự khác biệt nào ...

chỉnh sửa: có, như một trong số họ ở đây đã nói, chỉ truyền một tham số boolean cho window.location.reload () là sự khác biệt. nếu bạn vượt qua đúng , thì trình duyệt sẽ tải một trang mới, nhưng nếu sai , thì phiên bản bộ đệm đã được tải ...


0

Trong trường hợp của chúng tôi, chúng tôi chỉ muốn tải lại trang trong webview và vì một số lý do, chúng tôi không thể tìm hiểu lý do! Chúng tôi thử hầu hết mọi giải pháp đã có trên web, nhưng bị mắc kẹt khi không tải lại bằng location.reload () hoặc các giải pháp thay thế như window.location.reload (), location.reload (true), ...!

Đây là giải pháp đơn giản của chúng tôi:

Chỉ cần sử dụng thẻ <a> với giá trị phân bổ "href" trống như thế này:

< a href="" ...>Click Me</a>

(trong một số trường hợp, bạn phải sử dụng "return true" khi nhấp vào mục tiêu để kích hoạt tải lại)

Để biết thêm thông tin, hãy kiểm tra câu hỏi này: Có phải một href href hợp lệ không?


-3

window.location.href, điều này như đã cứu cuộc đời tôi trong webview từ Android 5.1. Trang không tải lại với location.reload () trong phiên bản này từ Android.

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.