2015-05-20 45 views
1

當你創建一個HTML元素,並添加一個ID給它,如:如何在JavaScript中處理破折號ID? (自動全局變量創建)

<div id="test"></div> 

它會自動提供JavaScript作爲變量test無需使用document.getElementById("test")

我想知道的是,當你創建一個破折號的ID會發生什麼,如:

<div id="test-one"></div> 

該元素將仍然可以在Javascript中通過一些變量或變量不會被創造出來的?我試圖檢查test-onetestOne的值,但沒有一個包含某些內容。

編輯

我想大多數人都誤解了這個問題。我知道用破折號創建一個變量是完全有效的。

這就是問題所在: http://jsfiddle.net/jn33bgkd/

你並不需要使用document.getElementById JavaScript,因此與ID的名稱相同(我知道這是一個不好的做法,利用這些,我只是想將自動創建全局變量知道什麼是行爲) 但是,如果ID有短劃線,則不會創建這些全局變量。問題是如果具有帶短劃線的ID的元素的全局變量實際上是未創建的,或者是使用不同的名稱創建的。

+3

有你測試了它......是什麼結果 –

+0

我知道使用破折號是有效的,我想知道,如果含有同名的HTML元素的全局變量該id仍然會被創建。 –

+3

僅供參考,它通常被認爲使用這些自動創建的全局變量擺在首位,因爲它太簡單了一些其他的JavaScript結束了與他們衝突的一個貧窮的戰略。只需使用'document.getElementById(「test-one」)'忘記自動創建的全局變量。 – jfriend00

回答

1

在JavaScript中,test-one是包含兩個標識符testone以及-運算符的表達式;本質上是兩個不相關變量之間的算術相減。正因爲如此,寫作test-one從字面上不會工作。

然而,該元素仍然可以使用索引器訪問,即window['test-one']

window['test-one'].innerHTML = 'Test';
<div id="test-one"></div>

請注意,以「測試一個」編號的元素是從未反映爲全球testOne,因爲它本來創建的ID與元素衝突「testOne」。

此行爲最初是非標準,它的根源在於IE瀏覽器。現在有文件in HTML5in the HTML Living Standard,儘管前者認爲它是非規範性的。推測這是爲了促進與傳統文檔的跨瀏覽器兼容性。

相關問題:Do DOM tree elements with ids become global variables?

+0

是的,謝謝這是我想要的答案。所以全局變量仍然存在,但只能通過窗口對象訪問。 –

2

你所要求的稱爲「拐點」,這是當諸如「test-one」之類的字符串被解釋爲「testOne」時。通常有一些採用這種方法的語言(例如:Ruby);然而它通常不是一個好方法,因爲它需要有規則來定義變形的圖書館,而變量並不總是標準化的。

記住,你總是可以快捷的方法:

var x = document.getElementById; 
var testOne = x("test-one"); 

你有沒有考慮過使用document.querySelectordocument.querySelectorAll

+1

「Shortcutting」的方法很少就像那;如果你將一個方法賦值給一個變量,那麼你最終會得到一個不再具有「this」正確思想的函數。你最好說'var x = document.getElementById.bind(document);'或類似的東西。 – cHao