Javascript: การตั้งค่า location.href กับตำแหน่ง


311

คุณจะตั้งlocationเป็นสตริง URL เมื่อเทียบกับการตั้งค่าเมื่อlocation.hrefใด

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

VS

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

การอ้างอิงเครือข่าย Mozilla Developer


6
การตั้งค่าlocation.hrefเมลล้มเหลวเนื่องจากนโยบายแหล่งกำเนิดเดียวกัน: javascript.info/tutorial/ …
Taha Jahangir


1
ฉันมีแอป Angular 4 ที่ใช้ TypeScript 2.6.2 window.location เป็นแบบอ่านอย่างเดียวและฉันสามารถกำหนดได้โดยใช้ window.location.href (ในบริบทของการโทรกลับจากการสมัครสมาชิกเชิงมุม) โดยไม่มีข้อผิดพลาดของคอมไพเลอร์ที่ถูก reaised- บางทีนั่นอาจเป็นจาวาสคริปต์ที่รองรับ 1.0 หรือเกี่ยวข้องกับการจัดการแบบอะซิงโคร . โดยทั่วไป window.location.href น่าจะเป็นสิ่งเดียวที่ใช้งานได้เสมอ
Chris Halcrow

คำตอบ:


261

คุณอาจตั้งค่าlocationโดยตรงเพราะสั้นกว่าเล็กน้อย หากคุณพยายามที่จะกระชับคุณมักจะละเว้นwindow.เช่นกัน

การกำหนด URL ให้กับทั้งสองlocation.hrefและlocationถูกกำหนดให้ทำงานใน JavaScript 1.0 ย้อนกลับไปใน Netscape 2 และมีการใช้งานในทุกเบราว์เซอร์ตั้งแต่นั้นเป็นต้นมา ดังนั้นเลือกของคุณและใช้สิ่งที่คุณพบว่าชัดเจน


9
เช่นเดียวกับที่กล่าวถึงโดย @SwissMister ในคำตอบด้านล่างดูเหมือนว่า window.location.href จะได้รับการปฏิบัติเหมือนคำขอ XHR หากถูกไล่ออกจากภายในการเรียกกลับสำเร็จของ XHR window.location.href จะถือว่าเป็น XHR ในขณะที่ window.location จะเลียนแบบการคลิกที่ลิงก์
Akshay Raje

147

แม้ว่าจะใช้ได้ทั้งคู่ฉันก็จะใช้อันหลัง locationเป็นวัตถุและการกำหนดสตริงให้กับวัตถุนั้นไม่เป็นลางดีสำหรับการอ่านหรือการบำรุงรักษา


60
ขณะที่การดำเนินการรวม PayPal ซับซ้อนผมพบเหตุผลที่น่าสนใจมากที่จะใช้window.location: มันไม่จำเป็นต้อง SAME ORIGIN
นายสวิส

4
อาจจะเป็นแค่ฉัน แต่location = 'http://www.example.com'ดูเหมือนว่าสุดยอด แม้ว่าเป็นกรณีพิเศษ ที่เข้ากันได้ย้อนหลังและจะยังคงเข้ากันได้ในอนาคตอันใกล้
Alex W

10
ถ้า window.location เป็นวัตถุการกำหนดสตริงให้มันจะเขียนทับมันด้วยสตริง ในความเป็นจริง window.location เป็นคุณสมบัติที่มีวิธี getter และ setter เมื่อคุณตั้งค่าสตริงคาดว่าและวัตถุที่ตั้งทั่วโลกมีการปรับปรุงโดย setter เมื่อคุณได้รับวัตถุที่ตั้งทั่วโลกจะถูกส่งกลับ
JukkaP

64

เหมือนได้รับแล้วกล่าวว่าเป็นวัตถุlocation แต่บุคคลนั้นแนะนำให้ใช้อย่างใดอย่างหนึ่ง แต่คุณจะทำดีกว่าที่จะใช้.hrefรุ่น

วัตถุมีคุณสมบัติเริ่มต้นซึ่งหากไม่มีการระบุสิ่งใดไว้จะถือว่าเป็นวัตถุ ในกรณีของวัตถุก็มีคุณสมบัติที่เรียกว่าlocation .hrefและโดยไม่ได้ระบุคุณสมบัติใด ๆ ในระหว่างการมอบหมายมันจะถือว่า "href" เป็นค่าเริ่มต้น

สิ่งนี้เป็นสิ่งที่ดีและดีจนกระทั่งรุ่นวัตถุในภายหลังเปลี่ยนไปและไม่มีคุณสมบัติเริ่มต้นอีกต่อไปหรือคุณสมบัติเริ่มต้นจะเปลี่ยนไป จากนั้นโปรแกรมของคุณหยุดพักโดยไม่คาดคิด

ถ้าคุณหมายถึงคุณควรระบุhrefhref


13
คำอธิบายที่ดีดีกว่าแค่ความคิดเห็นทั่วไปเกี่ยวกับความสามารถในการอ่านหรือการบำรุงรักษา ในความเป็นจริงในกรณีนี้โมเดลวัตถุจะไม่สามารถเปลี่ยนแปลงได้เนื่องจากครึ่งหนึ่งของเว็บจะหยุด - ดังนั้นใช้ทั้ง ... มันไม่สำคัญว่า
Neromancer

71
ฟังดูดี แต่ไม่จริงเลย ไม่มีแนวคิดของคุณสมบัติเริ่มต้นใน DOM หรือ JavaScript โดยทั่วไป การกำหนดสตริงให้ใช้locationงานได้เนื่องจากคุณสมบัติถูกกำหนดให้มีพฤติกรรมการมอบหมายพิเศษนี้กลับมาใน JavaScript 1.0 และทุกเบราว์เซอร์นับตั้งแต่มีการใช้งาน ตอนนี้ HTML5 ต้องการมัน ดังนั้นในขณะที่มันอาจจะสวยกว่าหรือมากกว่าที่สอดคล้องกันเพื่อกำหนดให้.hrefไม่มีข้อได้เปรียบด้านความเข้ากันได้ย้อนหลังหรือส่งต่อการทำเช่นนั้น
bobince

6
นับความน่ารัก
Tom Andersen

4
window.location = urlดีกว่า
Eric Muyser

21
location = urlis cuter
fregante

20

สองสามปีที่ผ่านมาlocationไม่ทำงานสำหรับฉันใน IE และlocation.href(และทั้งสองทำงานในเบราว์เซอร์อื่น) ตั้งแต่นั้นมาฉันมักจะใช้location.hrefและไม่เคยมีปัญหาอีกเลย ฉันจำไม่ได้ว่าเป็น IE เวอร์ชันใด


42
อาจเป็นไปได้ว่า IE เวอร์ชันหนึ่งที่มันทำสิ่งที่ผิดและเบราว์เซอร์อื่น ๆ นั้นทำได้ถูกต้อง ;-)
Shawn D.

9
ในstrict modechrome จะโยนข้อยกเว้นถ้าคุณพยายามที่จะกำหนดโดยตรงlocationเช่นกันดังนั้นฉันมักจะใช้location.href
Hashbrown

9
IE เวอร์ชัน "หนึ่ง"
Lpc_dark

@Shawn D. เบราว์เซอร์ทำสิ่งต่าง ๆ ถูกต้องหรือไม่ เกิดขึ้นเมื่อไหร่! : D
user2173353

15

เพียงชี้แจงคุณไม่สามารถทำlocation.split('#'), locationเป็นวัตถุไม่สตริง แต่คุณสามารถทำได้location.href.split('#');เพราะlocation.hrefเป็นสตริง


3
ความคิดเห็นของคุณเป็นจริง แต่คุณกำลังพูดถึงการรับคุณลักษณะ href, สตริง, ของวัตถุที่ตั้ง การสนทนาอื่น ๆ ทั้งหมดเกี่ยวข้องกับการกำหนดค่าไม่ใช่อ่านค่า แต่ประเด็นของคุณถูกต้อง ความแตกต่างคือ href เป็นสตริงในขณะที่สถานที่เป็นวัตถุ
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.