2009-04-30 21 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]现在可以是对 文档中的元素的引用,并且该代码可能不会按照开发者所期望的方式工作 。

这就是我们决定只让 这个怪癖的原因。