자바 스크립트 : location.href와 위치 설정


311

당신은 설정 할 때 location설정 대 URL 문자열 location.href?

location = "http://www.stackoverflow.com";

vs

location.href = "http://www.stackoverflow.com";

Mozilla 개발자 네트워크 참조


6
설정 location.href메일 때문에 동일 출처 정책의 실패 : javascript.info/tutorial/...
타하 자한 기르


1
TypeScript 2.6.2를 사용하는 Angular 4 앱이 있습니다. window.location은 읽기 전용이며 컴파일러 오류가 발생하지 않고 window.location.href (각 구독의 콜백 컨텍스트에서)를 사용하여 할당 할 수 있습니다. 어쩌면 일종의 JavaScript 1.0 호환성 문제이거나 비동기 처리와 관련이 있습니다. . 기본적으로 window.location.href는 항상 작동하는 유일한 것 같습니다.
Chris Halcrow

답변:


261

location약간 짧아서 직접 설정할 수 있습니다 . 간결 해 지려고한다면 보통 window.너무 생략 해도됩니다.

모두 URL 할당 location.href하고 location다시 넷스케이프 2, 자바 스크립트 1.0 일에 정의되어, 이후 모든 브라우저에서 구현되고있다. 따라서 선택하고 가장 명확한 것을 사용하십시오.


9
아래 답변에서 @SwissMister가 언급했듯이 window.location.href는 XHR 요청처럼 처리되는 것으로 보입니다. XHR의 성공 콜백 내에서 실행 된 경우 window.location.href는 XHR로 처리되는 반면 window.location은 링크 클릭을 에뮬레이트합니다.
Akshay Raje

147

두 가지 모두 작동하더라도 후자를 사용합니다. location는 객체이며 문자열을 객체에 할당해도 가독성이나 유지 관리에 적합하지 않습니다.


60
복잡한 페이팔 통합을 구현하는 동안, 나는 사용에 매우 강력한 이유가 발생했습니다 window.location: 이 필요하지 않습니다SAME ORIGIN .
스위스 미스터

4
어쩌면 그것은 나지만 location = 'http://www.example.com'읽기 쉬운 것 같습니다. 그럼에도 불구하고 특별한 경우입니다. 이는 이전 버전과 호환 되며 가까운 미래에도 호환 됩니다.
Alex W

10
window.location이 객체 인 경우 문자열을 할당하면 문자열로 덮어 씁니다. 사실 window.location은 getter 및 setter 메소드가있는 특성입니다. 설정하면 문자열이 예상되고 전역 위치 객체가 setter에 의해 업데이트됩니다. 당신이 그것을 얻을 때, 전역 Location 객체가 반환됩니다.
JukkaP

64

이미 말했듯이 location객체 입니다. 그러나 그 사람은 둘 중 하나를 사용하도록 제안했습니다. 그러나 .href버전 을 사용하는 것이 좋습니다 .

객체에는 다른 속성이 지정되지 않은 경우 기본 속성이 있습니다. location객체 의 경우 라는 속성이 .href있습니다. 그리고 할당하는 동안 ANY 속성을 지정하지 않으면 기본적으로 "href"로 간주됩니다.

이후의 객체 모델 버전이 변경되고 더 이상 기본 속성이 없거나 기본 속성이 변경 될 때까지이 모든 것이 정상입니다. 그러면 프로그램이 예기치 않게 중단됩니다.

의미 href하는 경우을 지정해야 href합니다.


13
가독성이나 유지 보수에 대한 일반적인 의견보다 나은 설명. 반 웹이 정지하는 것처럼이 특별한 경우에 실제로 개체 모델이 변경되지 않습니다 - 따라서 하나를 사용 ... 그것은 문제가되지 않는
Neromancer

71
이것은 잘 들리지만 사실이 아닙니다. 일반적으로 DOM 또는 JavaScript에는 기본 속성의 개념이 없습니다. location이 속성은 JavaScript 1.0 및 모든 브라우저에서 구현 한 이후로이 특수 할당 동작이 다시 정의되도록 정의 되었으므로 작동 하도록 문자열을 할당합니다. HTML5는 이제 그것을 요구합니다. 따라서에 할당하는 것이 더 예쁘거나 일관성이있을 수 있지만 .href이전 버전과의 호환성 이점은 없습니다.
bobince

6
예뻐요.
Tom Andersen

4
window.location = url더 예쁘다
Eric Muyser 1

21
location = urlis cuter
fregante

20

몇 년 전 locationIE에서 저에게 location.href효과가 없었으며 다른 브라우저에서도 효과가있었습니다. 그 이후로 나는 항상 방금 사용 location.href했으며 다시는 문제가 없었습니다. 어떤 버전의 IE인지 기억할 수 없습니다.


42
아마도 IE의 한 버전이 잘못되어 다른 모든 브라우저에서 올바르게 작동했을 것입니다. ;-)
Shawn D.

9
strict mode당신이 직접 지정하려고하면 크롬 예외가 발생합니다 location너무 내가 항상 사용할 수 있도록,location.href
Hashbrown

9
IE의 "하나"버전?
Lpc_dark

@Shawn D. 브라우저가 올바르게 작동합니까? 언제 그런 일이 있었습니까! : D
2173353

15

그냥 명확히하기 위해 당신이 할 수없는 location.split('#'), location객체가 아닌 문자열입니다. 그러나 문자열 location.href.split('#');이기 때문에 할 수 있습니다 location.href.


3
귀하의 의견은 사실이지만 위치 객체의 href 속성, 문자열을 얻는 것에 대해 이야기 하고 있습니다. 다른 모든 토론 에서는 값을 읽지 않고 값 을 할당 합니다. 그러나 요점은 맞습니다. 차이점은 href는 문자열이고 location은 객체입니다.
Phil DD

15

그러나 명심해야 할 한 가지 차이점입니다.

현재 URL을 사용하여 URL을 작성한다고 가정 해 봅시다. 다음 코드는 실제로 호출하지 String.replace않지만 다음 코드를 리디렉션합니다 Location.replace.

nextUrl = window.location.replace('/step1', '/step2');

다음 코드가 작동합니다.

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

3

TypeScript를 사용하면 기술적으로 다음과 같은 객체가 사용 window.location.href됩니다 window.location.

Properties
hash 
host 
hostname
href    <--- you need this
pathname (relative to the host)
port 
protocol 
search 

문자열 형식 window.location인 동안 설정 하면 형식 오류가 발생 window.location.href합니다.

출처

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