5 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
如前面的答案所述,此行為稱為窗口對(duì)象上的命名訪問(wèn)。該值name
的某些元素屬性和值id
的所有元素的屬性都可用作為全球性質(zhì)window
的對(duì)象。這些被稱為命名元素。由于window
是瀏覽器中的全局對(duì)象,因此每個(gè)命名元素都可以作為全局變量訪問(wèn)。
這最初是由Internet Explorer添加的,最終由所有其他瀏覽器實(shí)現(xiàn),僅僅是為了與依賴于此行為的站點(diǎn)兼容。有趣的是,Gecko(Firefox的渲染引擎)選擇僅以怪癖模式實(shí)現(xiàn)此功能,而其他渲染引擎則以標(biāo)準(zhǔn)模式啟用它。
然而,像Firefox 14,火狐現(xiàn)在支持命名訪問(wèn)上window
的標(biāo)準(zhǔn)模式對(duì)象也是如此。他們?yōu)槭裁锤淖冞@個(gè)?事實(shí)證明,仍有很多網(wǎng)站在標(biāo)準(zhǔn)模式下依賴此功能。微軟甚至發(fā)布了一個(gè)營(yíng)銷演示,阻止了該演示在Firefox中運(yùn)行。
Webkit最近考慮了相反的做法,window
僅將對(duì)象的命名訪問(wèn)權(quán)限降級(jí)為怪癖模式。他們通過(guò)與Gecko相同的推理決定反對(duì)它。
所以...瘋狂,因?yàn)榭雌饋?lái)這種行為在標(biāo)準(zhǔn)模式下在所有主流瀏覽器的最新版本中使用現(xiàn)在技術(shù)上是安全的。但是雖然命名訪問(wèn)看起來(lái)有點(diǎn)方便,但不應(yīng)該使用它。
為什么?本文總結(jié)了很多關(guān)于全局變量為什么不好的原因。簡(jiǎn)而言之,擁有一堆額外的全局變量會(huì)導(dǎo)致更多錯(cuò)誤。假設(shè)您不小心輸入了a的名稱var
并碰巧鍵入了id
一個(gè)DOM節(jié)點(diǎn),SURPRISE!
此外,盡管標(biāo)準(zhǔn)化,但瀏覽器的命名訪問(wèn)實(shí)現(xiàn)仍然存在很多差異。
IE錯(cuò)誤地使
name
表單元素(輸入,選擇等)可以訪問(wèn)屬性的值。Gecko和Webkit錯(cuò)誤地不會(huì)
<a>
通過(guò)其name
屬性訪問(wèn)標(biāo)簽。Gecko錯(cuò)誤地處理了多個(gè)具有相同名稱的命名元素(它返回對(duì)單個(gè)節(jié)點(diǎn)而不是引用數(shù)組的引用)。
如果你嘗試在邊緣情況下使用命名訪問(wèn),我相信還有更多。
正如其他答案中所提到的那樣,document.getElementById
用來(lái)獲取對(duì)DOM節(jié)點(diǎn)的引用id
。如果需要通過(guò)其name
屬性使用來(lái)獲取對(duì)節(jié)點(diǎn)的引用document.querySelectorAll
。
請(qǐng)不要在您的站點(diǎn)中使用命名訪問(wèn)來(lái)傳播此問(wèn)題。如此多的網(wǎng)絡(luò)開(kāi)發(fā)人員浪費(fèi)時(shí)間試圖追蹤這種神奇的行為。我們確實(shí)需要采取行動(dòng)并讓渲染引擎在標(biāo)準(zhǔn)模式下關(guān)閉命名訪問(wèn)。從短期來(lái)看,它會(huì)破壞一些做壞事的網(wǎng)站,但從長(zhǎng)遠(yuǎn)來(lái)看,這將有助于推動(dòng)網(wǎng)絡(luò)向前發(fā)展。
如果您有興趣,我可以在我的博客上更詳細(xì)地討論這個(gè)問(wèn)題 - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
getElementById()
在這些情況下你應(yīng)該堅(jiān)持,例如:
document.getElementById('example').innerHTML
IE喜歡在全局命名空間中混合使用元素name
和 ID
屬性,因此最好明確指出你想要獲得的內(nèi)容。
添加回答
舉報(bào)