JavaScript에서 window.location과 document.location의 차이점은 무엇입니까?


답변:


220

W3C에 따르면 동일합니다. 실제로는 브라우저 간 안전을 위해을 (를) window.location대신 사용해야합니다 document.location.

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


12
공감. 모순 된 답변. 대담하게도 동일하다고 밝힌 다음 밝은 텍스트의 차이점을 설명합니다. 그것들은 결정적으로 동일하지 않습니다.
— danorton

33
C'mon 트리거 해피 다운 투표자는 조금 밝아집니다. 대부분의 경우, 그들은 라훌이 지정한 동굴을 유사하게 생각합니다. 의미 론적으로 그를 못 박자. 작은 필라델피아, 여러분 나는 그의 대답이 완전히 만족 스럽다는 것을 알았습니다. +1 (크리스토프의 대답이 받아 들여 져야하지만, 라훌의 대답은 받아 들여질 수있다-최소한
— 공감할

7
window.location정당성을 제공하지 않고 모범 사례를 추천 (항상 사용 )하는 경우 -1 정당성을 제공하지 않으면 왜 조언을 받아야합니까? Christoph의 답변은 이와 관련하여 훨씬 더 유용합니다.
— Mark Amery

+1이지만 Phil Hamer와 Christoph의 답변을 아래에서 확인하십시오. 문제를 완전히 이해하기 위해 필수 배경 정보와 경고를 추가합니다.
— Jon z

당신이 다음 방금 document.location에와 있지만에서는 window.location이 할 수있는 자식 프레임에서 샌드 박스 프레임에 탐색을 수행하려는 경우 사실은 내가 예를 들어 둘 사이의 차이를, 알
— M.Abulsoud

207

현재 위치 객체를 얻는 정식 방법 은 1996 년의이 MSDN 페이지 와 2006 년의 W3C 초안을window.location 참조하십시오 .

이것을 document.location현재 URL 만 문자열로 반환 한와 비교하십시오 ( MSDN의이 페이지 참조 ). 혼동을 피하기 위해 아마도 DOM Level 1의 일부인 ( MSDN 참조) document.location로 대체되었습니다 .document.URL

지금까지 내가 아는 한, 모든 최신 브라우저는지도 document.location에 window.location,하지만, 난 여전히 선호 window.location그게 내가 처음 DHTML을 쓴 이후로 사용한 적이 무엇으로.


1
당신이 사용하는 경우 window.location, 그냥 사용하는 것이 동일하게 유효하지 location않습니까?
— commonpike

2
@commonpike 그것은 적어도 정의 된 모든 변수가 속성이되는 전역 객체 인 HTML 문서의 스크립트 컨텍스트에서 window객체이다. 따라서 스크립트의 최상위 수준에서 정의한 모든 변수 또는 함수는로 참조되는 객체의 속성이며 window이는 전역 객체입니다. 때와 같은 결석 글로벌 객체는 암시 window.하여 - location으로 해석됩니다 window.location. 주의 사항- if(an_undefined_variable)변수가 정의되지 않은 경우 fe 에서 오류가 발생합니다 if(window.an_undefined_variable).
— amn

92

window.location 은 모든 호환 브라우저에서 읽기 / 쓰기입니다.

document.location 은 Internet Explorer에서 최소한 읽기 전용이지만 Gecko 기반 브라우저 (Firefox, SeaMonkey)에서는 읽기 / 쓰기가 가능합니다.


10
document.locationIE에서 읽기 전용 인 클레임을 재현 할 수 없습니다 . IE 10, 9, 8 및 6에서 modern.ie의 VM을 사용하여 성공적으로 할당 할 수 있습니다 .
— Mark Amery

에 대한 의견 console.log(location);? !!
— Fr0zenFyr


37

흥미롭게도 'location'이라는 프레임, 이미지 또는 양식이있는 경우 'document.location'은 Location 객체 대신 프레임 창, 이미지 또는 양식에 대한 참조를 각각 제공합니다. 분명히 document.forms, document.images 및 window.frames 컬렉션 이름 조회가 window.location에 대한 매핑보다 우선하기 때문입니다.

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

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

2
우선 순위는 없으며 단순히 덮어 쓰기
— Pacerier

7
아니요, 덮어 쓰지 않습니다. 그림자로 표시되어 있으므로 Phil은 속성 확인 중에 요소가 우선합니다.
— kangax

@ kangax, 당신이 옳은 것 같습니다 : jsfiddle.net/uL4ysszr . 그러나이 행동은 얼마나 신뢰할 만합니까? 충분히 크로스 브라우저입니까?
— Pacerier

1
방금 이것을 테스트했습니다 (2016 년 10 월). 그것은 그 표시 window.location와 document.location크롬이나 파이어 폭스에 그림자 수 없습니다.
— Mr. Llama

1
@ Mr.Llama 당신이 맞아요. 모든 최신 브라우저가 더 이상 위에서 설명한 방식으로 작동하지 않는 것 같습니다. document.location에 "Unforgeable"속성을 제공 한 것으로 보입니다. 관련 Chromium 변경 : src.chromium.org/viewvc/blink?view=revision&revision=189862 그리고 Firefox 버그 : bugzilla.mozilla.org/show_bug.cgi?id=1133760
— Phil Hamer

27

내가 아는 한, 둘 다 동일합니다. 크로스 브라우저 안전을 위해 window.location대신 사용할 수 있습니다 document.location.

모든 최신 브라우저는지도 document.location에 window.location,하지만, 난 여전히 선호 window.location그것이 내가 처음으로 웹 페이지를 쓴 이후로 사용한 적이 무엇으로. 더 일관성이 있습니다.

또한 document.location === window.locationreturns 를 볼 수 있으며 true, 이는 둘 다 동일하다는 것을 명확하게합니다.


14

document.location === window.location 보고 true

또한

document.location.constructor === window.location.constructor 이다 true

참고 : Firefox 3.6, Opera 10 및 IE6에서 방금 테스트했습니다.


1
@Pacerier 왜? 객체의 경우 ===와 ==동일합니다.
— Mark Amery

4
@MarkAmery, 그건 틀렸고 쉽게 설명 할 수 있습니다 : "abc" == new String("abc")returns truewhile "abc" === new String("abc")returns false.
— Pacerier

7
비교했을 때 : 좋아 @Pacerier, 내가 그 약간 더 엄격하고 덜 모호하게 언급하자 두 개체를 (오히려 아무것도 단지 개체 이상) 서로, ==그리고 ===동일합니다. 사양 섹션 11.9.3 및 11.9.6을 참조하십시오 . 비 - 널 들어 비 정의되지 않은 수의 비 BOOL는 동일한 유형의 문자열이 아닌 값은, ==문제가 11.9.3 파트 1 층에 의해 지배된다 ===동일 판독 11.9.6 부 (7)에 의해 동작이 돌아 true한다면 x와 y는 같은 객체를 나타냅니다. 그렇지 않으면를 반환하십시오 false.
— Mark Amery

10
@MarkAmery는,이 모두가 보장하지 않습니다 document.location및 window.location객체를 가리키는. 트리플 이퀄라이제이션의 요점이 빠졌습니다. 2 equals를 사용 한다고해서 동일한 obj 임을 증명할 수 는 없습니다 . 2가 같으면 거짓 긍정을주기 때문에 3은 같고 2는 같지 않아야합니다. document.location에이 URL 문자열입니다함으로써 브라우저에서 동일 window.location.toString(), 그리고 document.location==window.location진정한 동안을 반환 document.location===window.locationfalse를 돌려줍니다.
— Pacerier

@Pacerier Aha-나는 마침내 그것을 얻는다. 적어도 document.location === window.location비교가 되는 한 당신은 꽤 정확합니다 . 사실 .constructor비교가 너무 수단에서 발생되고,이 대답은 여전히 소리라고 생각하지만, 사용하는 ===추론을 단순화한다.
— Mark Amery

11

예, 동일합니다. 브라우저 JS API의 많은 역사적 단점 중 하나입니다. 시도해보십시오 :

window.location === document.location

8

window.location은 오래된 브라우저를 고려할 때 두 가지보다 더 안정적입니다.


3

html 5는 더 이상 프레임 세트를 지원하지 않기 때문에 요즘의 차이점을보기는 어렵습니다. 그러나 프레임 셋이있을 때, document.location은 코드가 실행되는 프레임 만 리디렉션하고 window.location은 전체 페이지를 리디렉션합니다.


2

나는 window.location현재 URL 을 얻는 더 안정적인 방법 이라고 말할 것이다 . 다음은 URL에 해시 매개 변수를 추가하고 나중에 읽는 시나리오 중 하나에서 window.location와 의 차이점 document.url입니다.

URL에 해시 매개 변수를 추가 한 후

이전 브라우저에서는을 사용하여 URL에서 해시 매개 변수를 얻을 수 document.url없었지만 사용 window.location하면 URL에서 해시 매개 변수를 얻을 수있었습니다.

따라서 항상 사용하는 것이 좋습니다 window.location.


1
-1. 질문은 언급조차하지 않았습니다 document.URL- window.location그리고 에 관한 것 document.location입니다. 또한 document.url존재하지 않습니다 = 대문자 여야합니다.
— Mark Amery

2

document.location.constructor === window.location.constructor입니다 true.

에서 볼 수있는 것과 정확히 동일한 객체이기 때문입니다 document.location===window.location.

따라서 생성자 또는 다른 속성을 비교할 필요가 없습니다.


2

적어도 IE에서는 로컬 파일에 약간의 차이가 있습니다.

document.URL은 "file : // C : \ projects \ abc \ a.html"을 반환합니다.

그러나 window.location.href는 "file : /// C : /projects/abc/a.html"을 반환합니다

하나는 백 슬래시이고 다른 하나는 슬래시입니다.


2

그래, 그들은 동일하지만 ....!

window.location 일부 Internet Explorer 브라우저에서 작동하지 않습니다.


0

여기에서 권장하는 대부분의 사람들이 있음에도 불구하고 Google 애널리틱스 의 동적 프로토콜이 최근에 ga.js에서 analytics.js로 이동하기 전의 모습과 비슷합니다.

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

추가 정보 : https://developers.google.com/analytics/devguides/collection/gajs/

새 버전에서는 브라우저가 자동으로 프로토콜을 추가 할 수 있도록 '//'를 사용했습니다.

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

따라서 Google 이 JS에서 프로토콜이 필요할 때 document.location 을 선호 하는 window.location경우 몇 가지 이유가 있다고 생각합니다.

전반적인 : 나는 개인적으로 그렇게 생각 document.location하고 window.location있는 동일하지만, 같은 브라우저의 사용에 대한 가장 큰 통계와 거대한 경우 구글이 사용 document.location에를 , 나는 그들을 따라하는 것이 좋습니다.


2
그러나 이것은 매우 오래된 질문이며 귀하의 답변이 하나가 다른 것보다 낫다는 새롭거나 귀중한 증거를 제공하지 않기 때문일 수 있습니다. 또는 귀하의 답변이 Google이 역사적으로 한 일에 대한 가치에 상관없이 여론의 반대를 암시하기 때문일 수 있습니다. 또는 다운 보터가 실제로 강조 할 필요가없는 답변 부분을 강조하는 방식을 좋아하지 않았을 수도 있습니다. 정말 아무것도 될 수 있습니다. SO에 대한 익명 투표의 아름다움입니다.
— M.Babcock

0

실제로 둘 사이의 크롬 차이가 있음을 알 수 있습니다. 예를 들어 자식 프레임에서 샌드 박스 프레임으로 탐색하려면 window.location이 아닌 document.location 으로이 작업을 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.