当前位置: 首页 > 面试题库 >

具有ID的DOM树元素是否会成为全局变量?

贺俊材
2023-03-14
问题内容

在研究一个简单的HTMLElement包装器的想法时,我偶然发现了Internet
Explorer和Chrome的以下内容:

对于DOM树中具有ID的给定HTMLElement,可以使用其ID作为变量名来检索div。所以对于像

<div id="example">some text</div>

在Internet Explorer
8
和Chrome中,您可以执行以下操作:

alert(example.innerHTML); //=> 'some text'

要么

alert(window['example'].innerHTML); //=> 'some text'

那么,这是否意味着 DOM树中的每个元素都将
转换为全局名称空间中的变量?并且这是否也意味着可以用它代替getElementById这些浏览器中的方法?


问题答案:

应该发生的是添加了“命名元素”作为document对象的明显属性。这是一个非常糟糕的主意,因为它允许元素名称与的实际属性冲突document

IE也通过添加命名元素作为window对象的属性来使情况变得更糟。这是双重不利的,因为现在您必须避免在您可能想要使用documentwindow对象(或项目中的任何其他库代码)的任何成员之后命名元素。

这也意味着这些元素作为全局变量可见。幸运的是,在这种情况下,代码中的任何实际全局变量varfunction声明都将它们隐藏起来,因此您不必担心在此处命名,但是如果您尝试对名称冲突的全局变量进行赋值而忘记声明它var,您将在IE中遇到错误,因为它试图将值分配给元素本身。

通常,忽略var以及依赖命名元素在window全局变量上或全局变量上可见是不正确的做法。坚持document.getElementById,这是得到更广泛支持和较少含糊的内容。如果您不喜欢键入,则可以使用短名称编写平凡的包装函数。无论哪种方式,使用id到元素的查找缓存都是没有意义的,因为浏览器通常会优化getElementById调用以使用快速查找。当元素更改id或从文档中添加/删除元素时,您得到的只是问题。

歌剧复制IE,然后WebKit的加入进来,现在都将命名元素上的以前不标准,实践document特性,并把他们的先前IE-
只有实践window都被
标准化的HTML5,其方法是将文件和规范每浏览器作者对我们施加了可怕的习俗,使他们永远成为网络的一部分。因此,Firefox 4也将支持此功能。

什么是“命名元素”?带有id,和带有name用于“标识”目的的任何东西:即表单,图像,锚点和其他一些name属性,但没有其他与属性无关的实例,例如表单输入字段中的控件名称,<param>或中的元数据类型<meta>name应该避免使用“标识”
来代替id



 类似资料:
  • 我有一个布尔变量数组,如果该数组中的所有元素都具有相同的值,我想返回true,否则返回false。我知道我可以遍历所有元素,但我想知道C#中是否有更快的方法。

  • 本文向大家介绍行内元素float:left后是否变为块级元素?相关面试题,主要包含被问及行内元素float:left后是否变为块级元素?时的应答技巧和注意事项,需要的朋友参考一下 行内元素设置成浮动之后变得更加像是 inline-block 行内块级元素,设置成这个属性的元素会同时拥有行内和块级的特性,最明显的不同是它的默认宽度不是 100%,行内元素默认 100%宽度占据一行 这时候给行内元素设

  • 我试图创建一个自定义数据类型树。定义如下: 树可以定义为包含一条信息(即,它是一个没有子节点的节点)的叶(由关键字“叶”标识),或包含一条信息的节点(由关键字“节点”标识),再加上树列表–列表中的每个元素表示根在相应子节点上的子树。请注意,根据此定义,树永远不能为空。这意味着树可以是: 叶片数据;或 这是我的代码: 它可以编译,但当我尝试运行时: 而不是预期的输出,我得到以下错误: 我的函数的哪一

  • 问题内容: 我正在寻找一个DOM事件,该事件可以通过JavaScript进行监听,以了解通过打开选择元素(但未更改任何选项)然后通过关闭选择元素(在页面上其他位置)来关闭该元素。 这不是选择事件,因为选择保留了焦点。同样,这不是一些其他元素或文档或事件或窗口,文档或身体。 这不是选择事件,因为选择中的任何选项都没有更改。 我不关心旧版Internet Explorer,而只是在符合标准的现代浏览器

  • 当我在Inno Setup脚本的< code>[Code]部分(Pascal脚本)声明一个全局变量时,它是否自动初始化为零/空值?还是必须显式初始化它(例如在< code>InitializeSetup事件函数中)? 根据我的经验,变量是零初始化的。不过,我不确定我是否只是运气不好。 我已经完成了10.000次测试代码迭代。全局变量(或各种类型、整数、字符串、指针)始终为零初始化。

  • 问题内容: 有时我看到人们将原始CSS和javascript都应用于全局CSS样式,有时我看到他们将其应用于。 两者之间有什么区别吗?制作全局CSS样式的标准是什么?在它们之间进行选择时,我应该知道什么吗? 问题答案: 我假设这里的“全局页面样式”是指诸如字体,颜色和背景之类的东西。 就个人而言,我申请的全球页面样式,在大多数情况下,以和简单的元素选择(,,,,等)。这些元素与向用户呈现HTML页