考慮這個HTML源代碼:在IE和Opera中添加名稱屬性導致ID值成爲文檔對象的屬性?
<form id="foo1" name="x"> Form 1 </form>
<form id="foo2"> Form 2 </form>
正如你所看到的,我們定義了兩個表單元素。
在Chrome,Safari和Firefox中,document.foo1
和document.foo2
均返回undefined
。
但是,在IE和Opera中,document.foo1
返回對相應FORM元素的引用,而document.foo2
返回undefined
。
現場演示:http://jsfiddle.net/zrmEm/2/
所以,第一種形式確實有它的ID命名的屬性的文檔對象,第二個表格沒有。這種差異是將name
屬性添加到第一種形式的結果。
現在,那裏的邏輯在哪裏?這是一個已知的行爲嗎?
你應該簡單地忽略這些瀏覽器做的和不做的全局變量,因爲你不應該使用它們。他們不是標準的。使用'document.getElementById()'獲得一個帶有id的對象的DOM引用。它不同於一個瀏覽器的原因是它不是由標準定義的。 – jfriend00
只是不要讓Google知道它,否則他們會將其添加到Chrome的下一個版本中。我的意思是他們已經得到了'document.all'和'window.event'的好處。似乎他們暗中想成爲IE! – user113716
@Ӫ_._Ӫ爲時已晚。 Chrome瀏覽器(以及其他瀏覽器)確實添加了「遍佈全球」的窗口和文檔屬性。例如,對於上面的HTML代碼,Chrome會創建3個全局屬性:'window.foo1','window.foo2'和'window.x',以及一個文檔屬性:'document.x'(所有這些都是對錶格)。這種全球命名空間污染至少可以說是令人不安的,但除了Firefox(!!)之外的所有瀏覽器都這樣做。 **演示:** http://jsfiddle.net/c4tTw/ –