2011-05-26 103 views
0

爲什麼在ie8中工作?ie8中元素ID的奇怪行爲

function testFunction(ctrl) 
{ 
       alert(ctrl.value); 
} 

我在我的頁面上有一個JavaScript函數,像這樣。然後,我有一個輸入的標籤爲「text1」中的ID和以下onclick事件

<input id="text1" value="value" /> 

<input type="submit" onclick="testFunction(text1)" value="Click" /> 

javascript函數確實提醒文本框的值的按鈕,但我只是傳遞的標識文本框,不加引號。我不必打電話給getelementbyid,它只是起作用。什麼是在這裏做,它不適用於Firefox。如何將id變成實際的文本框對象,並且我可以調用它的cntrl.value?

P.S. - 我知道我不應該以這種方式使用onclick處理程序,只是一個簡單的方法來說明問題。

感謝

回答

8

這是你的頁面可能是在特殊模式和IE做討厭的DOM級別0東西的副作用。

實際的解釋是,在ID爲0的DOM Level 0元素會自動添加到window全局對象中,並且結果automagic變量會在全局範圍上創建,並指向您的DOM元素。

長話短說:不要那樣的代碼,有史以來。在瀏覽器通常試圖模仿其他瀏覽器所做的事情時,你依賴的是「事實上的」標準,而這種情況下,IE的行爲非常糟糕,而其他瀏覽器並沒有效仿。在合適的地方使用實際的DOM方法,如getElementById

+0

同意。還有一點需要注意的是:直接在代碼中使用id,而不是使用getElementById(),這是你在網絡JavaScript的早期時間裏總是看到的那種東西,這種做法當時被一些人鼓勵當時那些狡猾的「如何編寫JavaScript」網站。 (不喜歡*現在*,當「如何寫JavaScript」網站的100%提供100%準確的建議。)(我希望。) – nnnnnn 2011-05-26 23:52:27

+0

非常接近-1。與DOM 0無關,與專有IE行爲有關的一切。 DOM 0是瀏覽器之間常見的東西,但DOM 1之外。 – RobG 2011-05-27 01:31:41

+0

是的,可能更多的是DOM 0+。這是一個與DOM1尚未完成的同一時代的怪癖,但它仍然像DOM 0一樣工作,因爲它是由瀏覽器完成的自動映射,可讓您在不使用任何正式API的情況下訪問元素。 – gonchuki 2011-05-27 16:29:12

0

ctrl.value語法用於將name屬性設置爲「ctrl」的HTML元素。它不是標準的,它用於id。你必須使用getElementById來支持跨瀏覽器。

0

繼續從gonchuki回答。這就是你應該如何做的。

function testFunction(ctrl) 
{ 
    var obj = document.getElementById(ctrl); 
    alert(obj.value); 
} 

<input type="submit" onclick="testFunction('text1')" value="Click" /> 

另外,使用按鈕的onclick事件沒有任何問題。這就是它的目的。

希望這會有所幫助。

+0

感謝Ash Burlaczenko,雖然我知道如何使用getElementById,但我只是好奇,爲什麼ie沒有它。另外,我不認爲使用onclick事件有什麼問題,但我不喜歡使用像我上面的例子那樣的內聯事件,更喜歡在javascript中附加事件處理程序。 – user772110 2011-05-27 02:31:01