2009-04-30 23 views
1

我不知道這是一個衆所周知的'事情'或什麼新的火狐它只是更新自己的版本 - 但無論如何我不知道如何谷歌這個問題,所以我不得不問這裏。嚴格的doctype阻止訪問FireFox中的DOM變量

我在我的DOM,我想直接通過ID訪問DIV,在這樣最簡單的形式:

alert(btnTest.id); 

這在所有瀏覽器工作正常,但在Firefox是造成問題的是實際上導致瀏覽器處於一種奇怪的「破碎」狀態。

我得到的錯誤是'btnTest沒有定義'。我在Safari,Internet Explorer或Chrome中沒有遇到這個錯誤。

我認爲我有不匹配的HTML標籤,或JavaScript花括號或其他缺失。最終在剝離所有東西之後,我嘗試刪除DOCTYPE。突然在Firefox(v 3.0.10)中,它開始按預期返回正確的ID。

這是怎麼回事! ??當然,'嚴格'模式應該允許我訪問命名元素,如果不是,那麼爲什麼所有其他瀏覽器都讓我。

注:我可以很容易地解決它與$(「#爲btnTest」)[0] .ID,這正是我要現在要做的,直到我能想出更好的解決方案。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" class="blueCircles"> 

<head> 

    <script type="text/javascript" 
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 

    <script> 
     $(function() { 
      alert("ID retrieved through jQuery: " + $('#btnTest')[0].id); 
      alert("ID retrieved by accessing global variable: " + btnTest.id); 
     }); 

    </script> 

</head> 
<body> 
    <div id="btnTest"> 
    </div> 
</body> 
</html> 
+0

btnTest不是變量。這是一個DOM元素的ID。我沒有看到你想要實際做什麼。 document.getElementById(「btnTest」).id是有效的,但毫無意義。您已經知道該ID。 – 2009-04-30 08:14:07

+0

這是嘗試使用DOM元素做某事的大多數試用可能的示例。在這個例子中毫無意義,但正如我所說的,我必須縮小代碼來解決問題。可能會出現一些情況,我想要一個已知元素ID的「編譯安全」字符串,在這種情況下btnTest.id應該是有效的 - 而不是硬編碼「btnTest」。 我想在Firefox 3.0.10中有一個錯誤。此瀏覽器版本在我們的網站上顯示的銷售轉化率也較低。 – 2009-04-30 08:36:01

回答

2

沒有什麼的,說對象的引用,應在全球範圍內的腳本與id屬性的元素建立任何W3C規範。這被認爲是無法污染全局命名空間,並可能導致in confusing errors

爲了IE兼容性的目的,Firefox在怪癖模式下運行時會建立引用。約翰尼·斯滕巴克解釋在the bug for adding this support第三評論爲什麼這不是在標準模式下支持:

此功能不會影響標準 兼容的代碼,例如 檢查的全球 的所有腦幹[原文]變量只能設置一次。通過 這個變化,那個「變化的」[sic]現在可以是對 文檔中的元素的引用,並且該代碼可能不會按照開發者所期望的方式工作 。

這就是我們決定只讓 這個怪癖的原因。