ทั้งคู่ควรอ้างอิงวัตถุเดียวกันหรือไม่
ทั้งคู่ควรอ้างอิงวัตถุเดียวกันหรือไม่
คำตอบ:
ตาม W3C พวกเขาเหมือนกัน ในความเป็นจริงเพื่อความปลอดภัยของเบราว์เซอร์ข้ามคุณควรใช้มากกว่าwindow.locationdocument.location
window.location) โดยไม่ต้องให้เหตุผลใด ๆ หากคุณจะไม่ให้เหตุผลทำไมทุกคนควรใช้คำแนะนำของคุณ? คำตอบของ Christoph นั้นมีประโยชน์มากกว่าในเรื่องนี้
วิธีที่เป็นที่ยอมรับในการรับวัตถุตำแหน่งปัจจุบันคือwindow.location(ดูหน้า MSDN นี้ตั้งแต่ปี 1996และW3C ฉบับร่างจากปี 2549 )
เปรียบเทียบสิ่งนี้กับdocument.locationซึ่ง แต่เดิมส่งคืน URL ปัจจุบันเป็นสตริงเท่านั้น (ดูหน้านี้บน MSDN ) น่าจะเป็นที่จะหลีกเลี่ยงความสับสนdocument.locationถูกแทนที่ด้วยdocument.URL(ดูที่นี่ใน MSDN ) ซึ่งเป็นส่วนหนึ่งของDOM ระดับ 1
เท่าที่ฉันรู้เบราว์เซอร์ที่ทันสมัยทั้งหมดdocument.locationจะจับคู่กับwindow.locationแต่ฉันยังคงชอบwindow.locationที่เป็นสิ่งที่ฉันใช้ตั้งแต่ฉันเขียน DHTML ครั้งแรกของฉัน
window.locationมันไม่ถูกต้องหรือที่จะใช้location?
windowวัตถุ ดังนั้นตัวแปรหรือฟังก์ชั่นที่คุณกำหนดที่ระดับบนสุดของสคริปต์ของคุณเป็นคุณสมบัติของวัตถุที่อ้างอิงโดยwindowซึ่งเกิดขึ้นเป็นวัตถุทั่วโลก วัตถุทั่วโลกเป็นนัยเมื่อขาดเช่นwindow.- จึงถูกตีความว่าจะเป็นlocation window.locationCaveats - fe if(an_undefined_variable)จะโยนข้อผิดพลาดหากไม่ได้กำหนดตัวแปร - if(window.an_undefined_variable)จะไม่เกิดขึ้น
window.locationอ่าน / เขียนบนเบราว์เซอร์ที่เข้ากันได้ทั้งหมด
document.locationเป็นแบบอ่านอย่างเดียวใน Internet Explorer (อย่างน้อย) แต่อ่าน / เขียนในเบราว์เซอร์ที่ใช้ Gecko (Firefox, SeaMonkey)
document.locationอ่านได้อย่างเดียวใน IE ฉันสามารถกำหนดให้สำเร็จใน IE 10, 9, 8 และ 6 (โดยใช้ VM จากmodern.ie )
console.log(location);? !!
document.locationเดิมเป็นคุณสมบัติแบบอ่านอย่างเดียว แต่เบราว์เซอร์ Geckoช่วยให้คุณสามารถกำหนดได้ เพื่อความปลอดภัยข้ามเบราว์เซอร์ให้ใช้window.locationแทน
อ่านเพิ่มเติม:
น่าสนใจถ้าคุณมีเฟรมรูปภาพหรือฟอร์มชื่อ 'ตำแหน่งที่ตั้ง' ดังนั้น 'document.location' จะให้การอ้างอิงไปยังหน้าต่างเฟรมรูปภาพหรือฟอร์มตามลำดับแทนที่จะเป็นวัตถุตำแหน่ง เห็นได้ชัดว่านี่เป็นเพราะการค้นหาชื่อคอลเล็กชัน document.forms, document.images และ window.frames มีความสำคัญมากกว่าการแมปไปยัง window.location
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.locationและdocument.locationไม่สามารถแรเงาใน Chrome หรือ Firefox
เท่าที่ฉันรู้ทั้งสองเหมือนกัน เพื่อความปลอดภัยของเบราว์เซอร์ข้ามคุณสามารถใช้มากกว่าwindow.locationdocument.location
เบราว์เซอร์ที่ทันสมัยทั้งหมดแมปdocument.locationกับwindow.locationแต่ฉันยังคงชอบwindow.locationที่เป็นสิ่งที่ฉันใช้ตั้งแต่ฉันเขียนหน้าแรก มันสอดคล้องกันมากขึ้น
คุณยังสามารถเห็นdocument.location === window.locationผลตอบแทนtrueซึ่งชี้แจงว่าทั้งสองเหมือนกัน
document.location === window.location ผลตอบแทน true
ด้วย
document.location.constructor === window.location.constructor คือ true
หมายเหตุ: เพิ่งทดสอบกับ, Firefox 3.6, Opera 10 และ IE6
===และ==เทียบเท่า
"abc" == new String("abc")ผลตอบแทนtrueในขณะที่ผลตอบแทน"abc" === new String("abc") false
==และ===เทียบเท่า ดูข้อมูลจำเพาะส่วนที่ 11.9.3 และ 11.9.6 สำหรับค่าที่ไม่ใช่ค่า Null, ไม่ใช่ค่ากำหนด, ไม่ใช่ตัวเลข, ไม่ใช่บูล, ไม่ใช่ค่าสตริงที่มีชนิดเดียวกัน==พฤติกรรมจะถูกควบคุมโดย 11.9.3 ส่วนที่ 1f และ===พฤติกรรมตาม 11.9.6 ส่วนที่ 7 ซึ่งอ่านค่าส่งคืนtrueหาก x และ y หมายถึงวัตถุเดียวกัน falseมิฉะนั้นกลับ
document.locationและwindow.locationจะชี้ไปที่วัตถุ คุณพลาดจุดรวมของสามเท่ากับ ใช้ 2 เท่ากับไม่ได้พิสูจน์ว่าพวกเขาเป็น obj เดียวกัน เราควรใช้ 3 เท่ากับและไม่เท่ากับ 2 เพราะ 2 เท่ากับจะให้ค่าบวกเท็จ บนเบราว์เซอร์โดย document.location เป็นสตริง URL เท่ากับwindow.location.toString()จากนั้นdocument.location==window.locationจะคืนค่าจริงขณะที่document.location===window.locationจะคืนค่าเท็จ
document.location === window.locationเปรียบเทียบ ความจริงที่ว่าการ.constructorเปรียบเทียบถูกโยนด้วยวิธีที่มากเกินไปฉันคิดว่าคำตอบนี้ยังคงฟังดูดี แต่การใช้===จะทำให้การใช้เหตุผลง่ายขึ้น
ใช่พวกเขาเหมือนกัน มันเป็นหนึ่งในเรื่องราวที่ผ่านมามากมายใน JS API ของเบราว์เซอร์ ลองทำ:
window.location === document.location
window.location มีความสอดคล้องที่น่าเชื่อถือมากขึ้นในสองเรื่องนี้โดยพิจารณาจากเบราว์เซอร์รุ่นเก่า
ทุกวันนี้ยากที่จะเห็นความแตกต่างเนื่องจาก html 5 ไม่รองรับเฟรมเซตอีกต่อไป แต่เมื่อถึงเวลาที่เรามี frameset, document.location จะเปลี่ยนเส้นทางเฉพาะเฟรมที่โค้ดถูกประมวลผลและ window.location จะเปลี่ยนเส้นทางหน้าทั้งหมด
ฉันจะบอกว่า window.locationเป็นวิธีที่น่าเชื่อถือมากขึ้นในการได้รับในปัจจุบันURL ต่อไปนี้เป็นความแตกต่างระหว่างwindow.locationและdocument.urlที่มาก่อนหนึ่งในสถานการณ์ที่ฉันได้ต่อท้ายพารามิเตอร์แฮชใน URL และอ่านในภายหลัง
หลังจากเพิ่มพารามิเตอร์แฮใน URL
ในเบราว์เซอร์รุ่นเก่าฉันไม่สามารถรับพารามิเตอร์แฮชจาก URL โดยใช้document.urlแต่เมื่อฉันใช้window.locationแล้วฉันก็สามารถรับพารามิเตอร์แฮชได้จาก URL
window.locationดังนั้นก็มักจะดีกว่าที่จะใช้
document.URL- มันเป็นเรื่องเกี่ยวกับและwindow.location document.locationยังdocument.urlไม่มีอยู่ = ควรเป็นตัวพิมพ์ใหญ่
document.location.constructor === window.location.constructor คือ trueเป็น
เป็นเพราะมันเป็นวัตถุเดียวกับที่คุณเห็น document.location===window.locationก็เพราะมันเป็นเหมือนวัตถุเดียวกันในขณะที่คุณสามารถดูได้จาก
ดังนั้นไม่จำเป็นต้องเปรียบเทียบคอนสตรัคเตอร์หรือคุณสมบัติอื่นใด
อย่างน้อยใน IE มันมีความแตกต่างเล็กน้อยในไฟล์ในเครื่อง:
document.URL จะส่งคืน "ไฟล์: // C: \ projects \ abc \ a.html"
แต่ window.location.href จะส่งคืน "file: /// C: /projects/abc/a.html"
หนึ่งคือแบ็กสแลช, หนึ่งคือฟอร์เวิร์ดสแลช
ใช่พวกมันเหมือนกัน แต่ .... !
window.location ไม่ทำงานบนเบราว์เซอร์ Internet Explorer บางตัว
แม้จะมีผู้คนส่วนใหญ่แนะนำที่นี่ แต่เป็นวิธีที่โพรโทคอลไดนามิกของGoogle Analyticsดูเหมือนเป็นเวลานาน (ก่อนที่พวกเขาจะย้ายจาก 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ชอบdocument.locationไปwindow.locationเมื่อพวกเขาต้องการโปรโตคอลใน JS ผมคิดว่าพวกเขามีเหตุผลบางอย่างที่
โดยรวมแล้ว : โดยส่วนตัวแล้วฉันเชื่ออย่างนั้นdocument.locationและwindow.locationเหมือนกัน แต่ถ้ายักษ์ที่มีสถิติมากที่สุดเกี่ยวกับการใช้งานเบราว์เซอร์เช่นGoogleโดยใช้document.locationฉันแนะนำให้ติดตามพวกเขา
จริง ๆ แล้วฉันสังเกตเห็นความแตกต่างของโครเมี่ยมระหว่างทั้งสองตัวอย่างเช่นถ้าคุณต้องการทำการนำทางไปยังเฟรม sandboxed จากเฟรมลูกคุณสามารถทำได้เพียงแค่ใช้ document.location แต่ไม่ใช่กับ window.location