ตามที่ระบุไว้ในคำตอบก่อนหน้านี้พฤติกรรมนี้เป็นที่รู้จักกันเข้าถึงชื่อบนวัตถุหน้าต่าง ค่าของname
แอตทริบิวต์สำหรับองค์ประกอบบางอย่างและค่าของid
แอตทริบิวต์สำหรับองค์ประกอบทั้งหมดจะพร้อมใช้งานเป็นคุณสมบัติของwindow
วัตถุส่วนกลาง สิ่งเหล่านี้เรียกว่าองค์ประกอบที่มีชื่อ เนื่องจากwindow
เป็นวัตถุส่วนกลางในเบราว์เซอร์องค์ประกอบที่มีชื่อแต่ละรายการจะสามารถเข้าถึงได้เป็นตัวแปรส่วนกลาง
เดิมนี้ถูกเพิ่มโดย Internet Explorer และในที่สุดก็มีการใช้งานโดยเบราว์เซอร์อื่น ๆ ทั้งหมดเพื่อความเข้ากันได้กับเว็บไซต์ที่ขึ้นอยู่กับพฤติกรรมนี้ น่าสนใจ Gecko (เอ็นจิ้นการเรนเดอร์ของ Firefox) เลือกใช้สิ่งนี้ในโหมด quirksเท่านั้นในขณะที่เอ็นจิ้นการเรนเดอร์อื่น ๆ ปล่อยมันไว้ในโหมดมาตรฐาน
อย่างไรก็ตามในฐานะของ Firefox 14 ตอนนี้ Firefox รองรับการเข้าถึงแบบมีชื่อบนwindow
วัตถุในโหมดมาตรฐานเช่นกัน ทำไมพวกเขาถึงเปลี่ยนแปลงสิ่งนี้ ปรากฎว่ายังมีไซต์จำนวนมากที่ใช้ฟังก์ชันนี้ในโหมดมาตรฐาน ไมโครซอฟท์ยังได้เปิดตัวตัวอย่างการตลาดที่ป้องกันไม่ให้ตัวอย่างจากการทำงานใน Firefox
Webkit ได้พิจารณาสิ่งที่ตรงกันข้ามเมื่อเร็ว ๆ นี้ซึ่งมีการตั้งชื่อการเข้าถึงบนwindow
วัตถุให้เป็นโหมด quirks เท่านั้น พวกเขาตัดสินใจโดยใช้เหตุผลเดียวกับ Gecko
ดังนั้น ... บ้าอย่างที่ดูเหมือนว่าพฤติกรรมนี้คือตอนนี้ปลอดภัยทางเทคนิคที่จะใช้ในรุ่นล่าสุดของเบราว์เซอร์ที่สำคัญทั้งหมดในโหมดมาตรฐาน แต่ในขณะที่ชื่อเข้าถึงสามารถดูเหมือนสะดวกบ้างก็ไม่ควรนำมาใช้
ทำไม? จำนวนมากของเหตุผลสามารถสรุปได้ในบทความนี้เกี่ยวกับสาเหตุที่ตัวแปรทั่วโลกที่ไม่ดี พูดง่ายๆคือการมีตัวแปรระดับโลกจำนวนมากนำไปสู่ข้อผิดพลาดที่มากขึ้น สมมติว่าคุณพิมพ์ชื่อของ a var
และเกิดขึ้นกับการพิมพ์id
โหนด DOM โดยบังเอิญโดยไม่ตั้งใจ
นอกจากนี้แม้จะเป็นมาตรฐาน แต่ก็ยังมีข้อขัดแย้งเล็กน้อยในการนำเบราว์เซอร์ของการเข้าถึงที่มีชื่อมาใช้
- IE ทำให้ค่าของ
name
แอตทริบิวต์ที่สามารถเข้าถึงได้อย่างไม่ถูกต้องสำหรับองค์ประกอบของฟอร์ม (อินพุตเลือก ฯลฯ )
- Gecko และ Webkit อย่างไม่ถูกต้องไม่
<a>
สามารถเข้าถึงแท็กผ่านname
แอตทริบิวต์ของพวกเขา
- Gecko จัดการองค์ประกอบที่มีชื่อหลายชื่อไม่ถูกต้องด้วยชื่อเดียวกัน (จะส่งคืนการอ้างอิงไปยังโหนดเดียวแทนที่จะเป็นอาร์เรย์ของการอ้างอิง)
และฉันแน่ใจว่ามีมากขึ้นถ้าคุณลองใช้การเข้าถึงแบบมีชื่อในกรณีขอบ
ตามที่ระบุไว้ในคำตอบอื่น ๆ ที่ใช้document.getElementById
จะได้รับการอ้างอิงไปยังโหนด DOM id
โดยตัวของมัน หากคุณต้องการที่จะได้รับการอ้างอิงไปยังโหนดโดยตัวของมันใช้แอตทริบิวต์name
document.querySelectorAll
โปรดโปรดอย่าเผยแพร่ปัญหานี้โดยใช้การเข้าถึงแบบกำหนดชื่อในไซต์ของคุณ นักพัฒนาเว็บจำนวนมากเสียเวลาพยายามติดตามพฤติกรรมที่มหัศจรรย์นี้ เราจำเป็นต้องดำเนินการและรับเครื่องมือการแสดงผลเพื่อปิดการเข้าถึงชื่อในโหมดมาตรฐาน ในระยะสั้นมันจะทำลายบางเว็บไซต์ที่ทำสิ่งไม่ดี แต่ในระยะยาวมันจะช่วยย้ายเว็บไปข้างหน้า
หากคุณสนใจฉันพูดคุยเกี่ยวกับเรื่องนี้ในรายละเอียดเพิ่มเติมเกี่ยวกับบล็อกของฉัน - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/