Sự khác biệt giữa window.location và document.location trong JavaScript là gì?


Câu trả lời:


220

Theo W3C, chúng giống nhau. Trong thực tế, để an toàn trình duyệt chéo, bạn nên sử dụng window.locationhơn là document.location.

Xem: http://www.w3.org/TR/html/browsers.html#dom-location


12
Bị hạ bệ. Trả lời mâu thuẫn. Nó mạnh dạn nói rằng chúng giống nhau, sau đó mô tả sự khác biệt trong văn bản nhẹ hơn. Họ quyết định không giống nhau.
danorton

33
C'mon kích hoạt hạnh phúc cử tri xuống, làm sáng lên một chút. Đối với hầu hết các phần, họ hành xử tương tự XÁC NHẬN CAUPAT ĐẶC BIỆT bởi rahul. Chúng ta đừng đóng đinh anh ta về ngữ nghĩa. Một chút philips, quý ông. Tôi, cho một, tìm thấy câu trả lời của mình hoàn toàn thỏa mãn. +1 (Christoph's nên là câu trả lời được chấp nhận, nhưng rahul là chấp nhận được - ít nhất, không đáng để bỏ phiếu.)
cssyphus

7
-1 để đề xuất một thực tiễn tốt nhất (luôn luôn sử dụng window.location) mà không cung cấp bất kỳ lời biện minh nào cho nó. Nếu bạn sẽ không cung cấp lời biện minh, tại sao mọi người nên đưa ra lời khuyên của bạn? Câu trả lời của Christoph hữu ích hơn nhiều về vấn đề này.
Đánh dấu Amery

+1 nhưng cũng thấy câu trả lời của Phil Hamer và Christoph bên dưới, họ thêm thông tin cơ bản và cảnh báo để hiểu đầy đủ vấn đề.
Jon z

Trên thực tế tôi nhận thấy sự khác biệt giữa cả hai, Ví dụ: nếu bạn muốn điều hướng đến khung hình hộp cát từ khung con thì bạn có thể làm điều này chỉ với document.location chứ không phải với window.location
M.Abulsoud

207

Cách chính tắc để có được đối tượng vị trí hiện tại là window.location(xem trang MSDN này từ năm 1996bản nháp W3C từ năm 2006 ).

So sánh điều này với document.location, ban đầu chỉ trả về URL hiện tại dưới dạng chuỗi (xem trang này trên MSDN ). Có lẽ để tránh nhầm lẫn, document.locationđã được thay thế bằng document.URL(xem tại đây trên MSDN ), cũng là một phần của DOM Cấp 1 .

Theo như tôi biết, tất cả các trình duyệt hiện đại đều ánh xạ document.locationtới window.location, nhưng tôi vẫn thích window.locationnhững gì tôi đã sử dụng kể từ khi tôi viết DHTML đầu tiên của mình.


1
Nếu bạn sử dụng window.location, nó không hợp lệ như nhau chỉ để sử dụng location?
phổ biến

2
@commonpike Đó là - trong ngữ cảnh của một tập lệnh trong [ít nhất] một tài liệu HTML, đối tượng toàn cầu nơi tất cả các biến được xác định trở thành thuộc tính, là windowđối tượng. Do đó, bất kỳ biến hoặc hàm nào bạn xác định ở cấp cao nhất của tập lệnh của bạn, là một thuộc tính của đối tượng được tham chiếu bởi window, điều này xảy ra là đối tượng toàn cục. Đối tượng toàn cầu được ngụ ý khi vắng mặt như thế window.- do đó locationđược hiểu là window.location. Hãy cẩn thận - if(an_undefined_variable)sẽ gây ra lỗi nếu biến không được xác định - if(window.an_undefined_variable)sẽ không.
Amn

92

window.location được đọc / ghi trên tất cả các trình duyệt tuân thủ.

document.location chỉ đọc trong Internet Explorer (ít nhất), nhưng đọc / ghi trong các trình duyệt dựa trên Gecko (Firefox, SeaMonkey).


10
Tôi không thể sao chép khiếu nại chỉ document.locationđọc trong IE. Tôi có thể gán thành công cho nó trong IE 10, 9, 8 và 6 (sử dụng VM từ Modern.ie ).
Đánh dấu Amery

Có ý kiến console.log(location);gì về ? !!
Fr0zenFyr

44

document.locationban đầu là một thuộc tính chỉ đọc, mặc dù các trình duyệt Gecko cũng cho phép bạn gán cho nó. Để an toàn trên nhiều trình duyệt, hãy sử dụngwindow.location thay thế.

Đọc thêm:

document.location

window.location


Tôi không thể tìm thấy câu trả lời rõ ràng khi sử dụng bất kỳ câu hỏi nào trong số chúng, hãy xem câu trả lời của tôi dưới đây
M.Abulsoud

37

Thật thú vị, nếu bạn có khung, hình ảnh hoặc biểu mẫu có tên 'location', thì 'document.location' cung cấp một tham chiếu đến cửa sổ khung, hình ảnh hoặc biểu mẫu, thay vì đối tượng Location. Rõ ràng, điều này là do tra cứu tên bộ sưu tập document.forms, document.images và window.frames được ưu tiên hơn so với ánh xạ tới window.location.

<img name='location' src='location.png'>

if (document.location.tagName == 'IMG') alert('Hello!')

2
Không có ưu tiên, nó chỉ đơn giản là ghi đè
Pacerier

7
Không, nó không bị ghi đè. Nó bị che khuất, vì vậy Phil nói đúng về yếu tố được ưu tiên trong quá trình giải quyết tài sản.
kangax

@ Khangax, Có vẻ như bạn đúng: jsfiddle.net/uL4ysszr . Nhưng làm thế nào đáng tin cậy là hành vi này? Là nó đủ trình duyệt chéo?
Pacerier

1
Chỉ cần thử nghiệm này (tháng 10 năm 2016). Dường như window.locationdocument.locationkhông thể bị che khuất trong Chrome hoặc Firefox.
Ông Llama

1
@ Mr.Llama Bạn nói đúng. Nó xuất hiện tất cả các trình duyệt hiện đại không còn hoạt động theo cách tôi mô tả ở trên. Có vẻ như là do đưa ra document.location thuộc tính "Không thể tha thứ". Thay đổi Chromium có liên quan: src.chromium.org/viewvc/blink?view=revision&revision=189862 Và lỗi Firefox: bugzilla.mozilla.org/show_orms.cgi?id=1133760
Phil Hamer

27

Theo tôi biết, cả hai đều giống nhau. Để an toàn trình duyệt chéo, bạn có thể sử dụng window.locationchứ không phải document.location.

Tất cả các trình duyệt hiện đại ánh xạ document.locationtới window.location, nhưng tôi vẫn thích window.locationnhững gì tôi đã sử dụng kể từ khi tôi viết trang web đầu tiên của mình. nó phù hợp hơn

bạn cũng có thể thấy document.location === window.locationlợi nhuận true, điều này làm rõ rằng cả hai đều giống nhau.


14

document.location === window.location trả lại true

cũng thế

document.location.constructor === window.location.constructortrue

Lưu ý: Chỉ cần thử nghiệm trên, Firefox 3.6, Opera 10 và IE6


1
@Pacerier Tại sao? Đối với các đối tượng, =====là tương đương.
Đánh dấu Amery

4
@MarkAmery, Điều đó sai và có thể dễ dàng chứng minh: "abc" == new String("abc")trả về truetrong khi "abc" === new String("abc")trả về false.
Pacerier

7
@Pacerier Được rồi, hãy để tôi nói điều đó một cách chặt chẽ hơn và ít mơ hồ hơn: khi so sánh hai đối tượng với nhau (thay vì chỉ là một đối tượng với bất cứ điều gì), =====tương đương. Xem các phần đặc tả 11.9.3 và 11.9.6. Đối với các giá trị không null, không xác định, không số, không bool, không chuỗi có cùng loại, ==hành vi được điều chỉnh bởi 11.9.3 phần 1f và ===hành vi của 11.9.6 phần 7, đọc chính xác Trả về truenếu x và y đề cập đến cùng một đối tượng. Nếu không, trở lại false.
Đánh dấu Amery

10
@MarkAmery, Không có gì đảm bảo rằng cả hai document.locationwindow.locationđang chỉ vào các đối tượng. Bạn đang thiếu toàn bộ điểm của ba bằng; sử dụng 2 bằng không chứng minh rằng chúng là cùng một obj. Chúng ta nên sử dụng 3 bằng và không 2 bằng vì 2 bằng sẽ cho chúng ta dương tính giả. Trên trình duyệt, theo đó document.location là một chuỗi URL bằng window.location.toString(), Sau đó document.location==window.locationsẽ trả về true trong khi document.location===window.locationsẽ trả về false.
Pacerier

@Pacerier Aha - Cuối cùng tôi cũng hiểu. Bạn khá chính xác, ít nhất là theo như document.location === window.locationso sánh. Thực tế là sự .constructorso sánh được đưa ra quá có nghĩa, tôi nghĩ rằng câu trả lời này vẫn đúng, nhưng việc sử dụng ===sẽ đơn giản hóa lý do.
Đánh dấu Amery

11

Vâng, họ giống nhau. Đây là một trong nhiều điều kỳ quặc trong lịch sử API API của trình duyệt. Hãy thử làm:

window.location === document.location

8

window.location là sự phù hợp đáng tin cậy hơn của cả hai, xem xét các trình duyệt cũ hơn.


3

Ngày nay, rất hiếm khi thấy sự khác biệt vì html 5 không hỗ trợ bộ khung nữa. Nhưng trở lại vào thời điểm chúng ta có frameset, document.location sẽ chỉ chuyển hướng khung trong đó mã đang được thực thi và window.location sẽ chuyển hướng toàn bộ trang.


2

Tôi muốn nói window.locationlà cách đáng tin cậy hơn để có được URL hiện tại . Sau đây là sự khác biệt giữa window.locationdocument.urlxuất hiện ở một trong những tình huống mà tôi đang nối các tham số băm trong URL và đọc nó sau.

Sau khi thêm các tham số băm trong URL.

Trong một trình duyệt cũ hơn, tôi không thể lấy các tham số băm từ URL bằng cách sử dụng document.url, nhưng khi tôi sử dụng window.locationthì tôi có thể nhận được các tham số băm từ URL.

Vì vậy, nó luôn luôn tốt hơn để sử dụng window.location.


1
-1. Câu hỏi thậm chí không đề cập đến document.URL- đó là về window.locationdocument.location. Ngoài ra, document.urlkhông tồn tại = nó nên viết hoa.
Đánh dấu Amery

2

document.location.constructor === window.location.constructortrue.

Đó là bởi vì nó chính xác là cùng một đối tượng mà bạn có thể nhìn thấy document.location===window.location.

Vì vậy, không cần phải so sánh các nhà xây dựng hoặc bất kỳ tài sản nào khác.


2

Ít nhất là trong IE, nó có một chút khác biệt trên tệp cục bộ:

document.URL sẽ trả về "tệp: // C: \ dự án \ abc \ a.html"

nhưng window.location.href sẽ trả về "tệp: /// C: /projects/abc/a.html"

Một là chém ngược, một là chém về phía trước.


2

Vâng, họ giống nhau, nhưng ....!

window.location không hoạt động trên một số trình duyệt Internet Explorer.


0

Mặc dù hầu hết mọi người khuyên dùng ở đây, đó là cách giao thức động của Google Analytics bị cắt xén trông giống như lâu đời (trước khi họ chuyển từ ga.js sang analytics.js gần đây):

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

Thông tin thêm: https://developers.google.com/analytics/devguides/collection/gajs/

Trong phiên bản mới, họ đã sử dụng '//' để trình duyệt có thể tự động thêm giao thức:

'//www.google-analytics.com/analytics.js'

Vì vậy, nếu Google thích document.location đến window.locationkhi họ cần giao thức trong JS, tôi đoán họ có một số lý do cho điều đó.

TỔNG QUAN : Cá nhân tôi tin điều đó document.locationwindow.locationgiống nhau, nhưng nếu khổng lồ với số liệu thống kê lớn nhất về việc sử dụng các trình duyệt như Google bằng cách sử dụng document.location , tôi khuyên bạn nên theo dõi chúng.


2
Tôi đã không downvote, tuy nhiên, có thể là vì đây là một câu hỏi thực sự cũ và câu trả lời của bạn không cung cấp bất kỳ bằng chứng mới hoặc có giá trị nào cho thấy cái này tốt hơn cái kia. Hoặc, có thể là do câu trả lời của bạn cho thấy điều ngược lại với dư luận, bất kể công lao bạn dành cho những gì Google đã làm trong lịch sử. Hoặc, có thể là người downvoter không thích cách bạn nhấn mạnh vào các phần của câu trả lời mà bạn không thực sự cần nhấn mạnh. Có thể là bất cứ điều gì thực sự. Đó là vẻ đẹp của bỏ phiếu ẩn danh trên SO.
M.Babcock

0

Trên thực tế tôi nhận thấy sự khác biệt về chrome giữa cả hai, Ví dụ: nếu bạn muốn điều hướng đến khung hình hộp cát từ khung con thì bạn có thể làm điều này chỉ với document.location chứ không phải với window.location

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.