我不知道这是一个众所周知的“东西”还是什么新东西,无论在哪个版本的Firefox中它也只是更新了 - 但在任何一种情况下我都不知道如何谷歌这个问题所以我会有在这里问一下。

我的DOM中有一个DIV,我试图通过id直接访问,以这种最简单的形式:

 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>
有帮助吗?

解决方案

任何W3C规范中都没有说明应该在具有 id 属性的元素的全局脚本范围内建立对象引用。这被认为是不成功地污染全局命名空间并且可能导致令人困惑的错误

Firefox为了兼容IE而在quirks模式下运行时建立引用。 Johnny Stenback在关于添加此支持的错误的第三条评论中解释了为什么这样做标准模式不支持:

  

此功能确实会影响标准   例如,兼容的代码   检查全局的存在[ sic ]   变量只设置一次。同   这种变化,即“可变”。 [ sic ]现在可能是   对元素中的元素的引用   文档,代码可能无法正常工作   开发者的意图。

     

这就是我们决定制作的原因   这只是怪癖。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top