getElementById()的商业案例

时间:2016-09-13 00:35:00

标签: javascript dom

我的理解是,每个现代浏览器(包括桌面和移动设备)都会向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>

2 个答案:

答案 0 :(得分:3)

  

对于非病态的情况(例如,ID与全局命名空间中的另一个对象匹配)...

因为字面上任何变量可以添加到全局命名空间,所以 no 的情况是&#34;不是pathalogical&#34;。

  除了对向后兼容性的错误担忧之外,是否有任何理由这样做?

按照惯例,我们避免引入全局变量,否则这些变量会与现有的全局变量冲突(例如,我们不会声明var documentvar 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;

必须两次查找文档。