我的理解是,每个现代浏览器(包括桌面和移动设备)都会向ID表示具有全局JavaScript命名空间ID的元素。尽管如此,整个行业的人仍在使用document.getElementById()
或其jQuery表兄$("#TheID")
。
对于非病态的情况(例如,ID与全局命名空间中的另一个对象匹配),除了对向后兼容性的错误关注之外,是否有任何理由这样做?你需要多长时间才能开始这么做?
编辑:请考虑以下事项:
<html>
<body>
<input type="hidden" id="Foo" value="Hello world"/>
<input type="button" onclick="alert(Foo.value);" value="Press this"/>
</body>
</html>
在Windows,Chrome,Firefox,Opera,Mac上的Safari,iPad上的Safari,Android浏览器,Windows Phone上的MSIE上显示MSIE上的“Hello world”...为什么有人会使用document.getElementById("Foo").value
?< / p>
答案 0 :(得分:3)
对于非病态的情况(例如,ID与全局命名空间中的另一个对象匹配)...
因为字面上任何变量可以添加到全局命名空间,所以 no 的情况是&#34;不是pathalogical&#34;。
除了对向后兼容性的错误担忧之外,是否有任何理由这样做?
按照惯例,我们避免引入全局变量,否则这些变量会与现有的全局变量冲突(例如,我们不会声明var document
或var setTimeout
)。实际上,通常建议您通过将任何全局变量封装在某个范围内来避免引入它们。
如果您不这样做,您将很快遇到维护问题。不会扩展的维护问题。
考虑您拥有[id="question"]
元素的情况。如果您依赖question
的全局引用来引用该元素,并且其他人正在您的项目中决定在其他位置引入question.js
模块,那么您将拥有真的很难调试这个问题。
引用question
DOM节点背后的意图将不清楚,访问该元素的方法同样不明确。
此外,您如何处理ID更改的情况?如果使用document.getElementById(...)
,则需要存储对DOM节点的引用。如果ID发生变化,您只需在一个地方更新选择器。
如果您开始使用DOM节点的全局引用,则需要更新所有用法。
避免对DOM节点进行全局引用的原因是 nothing 与兼容性有关,以及与它是一个可怕的功能这一事实有关。
答案 1 :(得分:0)
另一个原因可能是表现。据我所知,仅一次引用文档是首选方法。请参阅10 Javascript Performance Boosting Tips from Nicholas Zakas 1.定义局部变量
换句话说:
var doc = document;
var btn = doc.getElementById('myButton');
var img = doc.getElementById('myImage');
而
var btn = myButton;
var img = myImage;
必须两次查找文档。