搜尋
首頁web前端css教學命名元素ID可以稱為JavaScript Globals

Named Element IDs Can Be Referenced as JavaScript Globals

您知道嗎?帶有ID的DOM元素可在JavaScript中作為全局變量訪問?這是一個存在已久的功能,但我才第一次深入研究它。

如果您第一次聽說這個功能,請做好準備!只需在HTML中向元素添加ID,我們就可以看到它在實際中的應用:

<div id="cool"></div>

通常,我們會使用querySelector("#cool")getElementById("cool")定義一個新變量來選擇該元素:

var el = querySelector("#cool");

但實際上,我們無需這些繁瑣的操作就能訪問#cool

因此,HTML中的任何ID(或name屬性)都可以在JavaScript中使用window[ELEMENT_ID]訪問。再次強調,這並非“新”功能,但很少見。

正如您可能猜到的那樣,使用命名引用訪問全局作用域並非最佳方案。有些人稱其為“全局作用域污染者”。我們將探討原因,但首先……

一些背景

這種方法在HTML規範中有所描述,其中將其描述為“Window對象的命名訪問”。

Internet Explorer是第一個實現此功能的瀏覽器。其他瀏覽器也添加了此功能。當時,Gecko是唯一一個不直接在標準模式下支持它的瀏覽器,而是選擇將其作為實驗性功能。人們對是否實現它猶豫不決,但為了瀏覽器的兼容性,它最終得以推進(Gecko甚至試圖說服WebKit將其從標準模式中移除),並最終在Firefox 14中進入標準模式。

可能鮮為人知的一點是,瀏覽器不得不採取一些預防措施(成功程度各不相同),以確保生成的全局變量不會破壞網頁。其中一項措施是……

變量遮蔽

此功能最有趣的部分可能是命名元素引用不會遮蔽現有的全局變量。因此,如果DOM元素的ID已定義為全局變量,它不會覆蓋現有的變量。例如:

window.foo = "bar";
<div id="foo">I won't override window.foo</div>
console.log(window.foo); // 输出 "bar"

反之亦然:

<div id="foo">I will be overridden :(</div>
window.foo = "bar";
console.log(window.foo); // 输出 "bar"

此行為至關重要,因為它可以消除危險的覆蓋,例如<div id="alert"></div>,否則它會通過使alert API失效而造成衝突。這種保護技術很可能是您(如果您像我一樣)第一次了解它的原因。

反對命名全局變量的論據

前面我說過,使用命名全局元素作為引用可能並非最佳方案。有很多原因,TJ VanToll在他的博客中對此進行了很好的闡述,我將在此處總結:

  • 如果DOM發生更改,則引用也會更改。 這使得代碼非常“脆弱”(規範中的術語),HTML和JavaScript之間的關注點分離可能過於嚴格。
  • 意外引用過於容易。 一個簡單的錯字很可能會引用一個命名全局變量,並給您帶來意想不到的結果。
  • 在不同的瀏覽器中實現方式不同。 例如,我們應該能夠訪問具有ID的錨點(例如<a><code><a></a>),但某些瀏覽器(即Safari和Firefox)會在控制台中返回ReferenceError。
  • 它可能不會返回您認為的結果。 根據規範,當DOM中存在多個相同命名元素的實例時(例如,兩個<div><code><div>實例),瀏覽器應該返回一個包含這些實例數組的HTMLCollection。但是,Firefox只返回第一個實例。再說一次,規範指出我們應該在元素樹中使用一個ID實例。但是這樣做不會阻止頁面工作或任何類似的事情。 <li> <strong>可能有性能成本? </strong> 我的意思是,瀏覽器必須創建該引用列表並維護它。一些人在StackOverflow線程中運行了測試,其中命名全局變量在一個測試中實際上性能更高,而在最近的測試中性能較低。 </li> <h3 id="其他注意事項">其他注意事項</h3> <p>假設我們拋棄了反對使用命名全局變量的批評,並繼續使用它們。一切順利。但是,在您這樣做時,您可能需要考慮一些事情。 </p> <h4 id="polyfills">polyfills</h4> <p>聽起來可能很極端,但這些類型的全局檢查是polyfills的典型設置要求。查看以下示例,我們使用新的CookieStore API設置cookie,在尚不支持它的瀏覽器中對其進行polyfill:</p> <pre class="brush:php;toolbar:false">&lt;div id=&quot;cool&quot;&gt;&lt;/div&gt;</pre> <p>這段代碼在Chrome中運行良好,但在Safari中會拋出以下錯誤:</p> <pre class="brush:php;toolbar:false">var el = querySelector(&quot;#cool&quot;);</pre> <p>在撰寫本文時,Safari不支持CookieStore API。因此,polyfill不會應用,因為img元素ID會創建一個與cookieStore全局變量衝突的全局變量。 </p> <h4 id="JavaScript-API更新">JavaScript API更新</h4> <p>我們可以改變情況,找到另一個問題,即瀏覽器JavaScript引擎的更新可能會破壞命名元素的全局引用。 </p> <p>例如:</p> <pre class="brush:php;toolbar:false">window.foo = &quot;bar&quot;;</pre> <p>該腳本獲取對輸入元素的引用,並在其上調用focus()。它可以正常工作。但是,我們不知道它還能工作多久。 </p> <p>您會看到,我們用來引用輸入元素的全局變量一旦瀏覽器開始支持BarcodeDetector API就會停止工作。那時,window.BarcodeDetector全局變量將不再是輸入元素的引用,而.focus()將拋出“window.BarcodeDetector.focus is not a function”錯誤。 </p> <h3 id="結論">結論</h3> <p>讓我們總結一下我們是如何走到這一步的:</p> <ul> <li>所有主要瀏覽器都會自動創建對每個具有id(或在某些情況下為name屬性)的DOM元素的全局引用。 </li> <li>通過其全局引用訪問這些元素是不可靠的,並且可能很危險。請改用<code>querySelectorgetElementById
  • 由於全局引用是自動生成的,它們可能會對您的代碼產生一些副作用。這是一個避免使用id屬性的好理由,除非您確實需要它。

最終,最好避免在JavaScript中使用命名全局變量。我前面引用了規範中關於它會導致“脆弱”代碼的內容,但以下是完整的文本,以強調這一點:

一般來說,依賴於此會導致脆弱的代碼。隨著時間的推移,哪些ID最終映射到此API可能會發生變化,例如,隨著新功能添加到Web平台。不要這樣做,請使用document.getElementById()document.querySelector()

我認為HTML規範本身建議避免使用此功能就說明了一切。

以上是命名元素ID可以稱為JavaScript Globals的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
CSS包含:為您的項目選擇正確的方法CSS包含:為您的項目選擇正確的方法May 16, 2025 am 12:02 AM

ThebestmethodforincludingCSSdependsonprojectsizeandcomplexity:1)Forlargerprojects,useexternalCSSforbettermaintainabilityandperformance.2)Forsmallerprojects,internalCSSissuitabletoavoidextraHTTPrequests.Alwaysconsidermaintainabilityandperformancewhenc

這不應該發生:對不可能進行故障排除這不應該發生:對不可能進行故障排除May 15, 2025 am 10:32 AM

解決這些不可能的問題之一,這是您從未想過的其他問題的問題。

@KeyFrames vs CSS過渡:有什麼區別?@KeyFrames vs CSS過渡:有什麼區別?May 14, 2025 am 12:01 AM

@keyframesandCSSTransitionsdifferincomplexity:@keyframesallowsfordetailedanimationsequences,whileCSSTransitionshandlesimplestatechanges.UseCSSTransitionsforhovereffectslikebuttoncolorchanges,and@keyframesforintricateanimationslikerotatingspinners.

使用頁面CMS進行靜態站點內容管理使用頁面CMS進行靜態站點內容管理May 13, 2025 am 09:24 AM

我知道,我知道:有大量的內容管理系統選項可用,而我進行了幾個測試,但實際上沒有一個是一個,y&#039;知道嗎?怪異的定價模型,艱難的自定義,有些甚至最終成為整個&

鏈接HTML中CSS文件的最終指南鏈接HTML中CSS文件的最終指南May 13, 2025 am 12:02 AM

鏈接CSS文件到HTML可以通過在HTML的部分使用元素實現。 1)使用標籤鏈接本地CSS文件。 2)多個CSS文件可通過添加多個標籤實現。 3)外部CSS文件使用絕對URL鏈接,如。 4)確保正確使用文件路徑和CSS文件加載順序,優化性能可使用CSS預處理器合併文件。

CSS Flexbox與網格:全面評論CSS Flexbox與網格:全面評論May 12, 2025 am 12:01 AM

選擇Flexbox還是Grid取決於佈局需求:1)Flexbox適用於一維佈局,如導航欄;2)Grid適合二維佈局,如雜誌式佈局。兩者在項目中可結合使用,提升佈局效果。

如何包括CSS文件:方法和最佳實踐如何包括CSS文件:方法和最佳實踐May 11, 2025 am 12:02 AM

包含CSS文件的最佳方法是使用標籤在HTML的部分引入外部CSS文件。 1.使用標籤引入外部CSS文件,如。 2.對於小型調整,可以使用內聯CSS,但應謹慎使用。 3.大型項目可使用CSS預處理器如Sass或Less,通過@import導入其他CSS文件。 4.為了性能,應合併CSS文件並使用CDN,同時使用工具如CSSNano進行壓縮。

Flexbox vs Grid:我應該學習兩者嗎?Flexbox vs Grid:我應該學習兩者嗎?May 10, 2025 am 12:01 AM

是的,youshouldlearnbothflexboxandgrid.1)flexboxisidealforone-demensional,flexiblelayoutslikenavigationmenus.2)gridexcelstcelsintwo-dimensional,confffferDesignssignssuchasmagagazineLayouts.3)blosebothenHancesSunHanceSlineHancesLayOutflexibilitibilitibilitibilitibilityAnderibilitibilityAndresponScormentilial anderingStruction

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。