研究一个简单的HTMLElement包装器的想法我偶然发现了Internet Explorer和Chrome的以下内容:
对于DOM树中具有ID的给定HTMLElement,可以使用其ID作为变量名来检索div.所以对于一个喜欢的div
<div id="example">some text</div>
Run Code Online (Sandbox Code Playgroud)
在Internet Explorer 8和Chrome中,您可以执行以下操作:
alert(example.innerHTML); //=> 'some text'
Run Code Online (Sandbox Code Playgroud)
要么
alert(window['example'].innerHTML); //=> 'some text'
Run Code Online (Sandbox Code Playgroud)
那么,这是否意味着DOM树中的每个元素都转换为全局命名空间中的变量?它是否也意味着可以使用它作为getElementById这些浏览器中方法的替代品?
就在今天经过几年的javascript编程之后,我遇到了令我吃惊的东西.浏览器为每个具有id的元素创建对象.对象的名称将与id匹配.
所以如果你有:
<div id ="box"></div>
Run Code Online (Sandbox Code Playgroud)
你可以做:
alert(box); //[object HTMLDivElement]
Run Code Online (Sandbox Code Playgroud)
没有先为该变量分配任何内容.看演示.
由于某种原因,这似乎是在标准中,即使它在某些情况下可能会破坏代码.有一个开放的bug来结束这种行为,但我现在更感兴趣摆脱它.
你们知道是否有办法禁用它(严格的模式可能)?我是否过分重视?因为这看起来确实是一个坏主意.(它是由IE推出给你一个提示).
更新:似乎FF只在怪癖模式下执行此操作.像IE6 +和Chrome这样的其他浏览器可以立即实现.
今天发现了这种奇怪的行为.如果我有以下HTML:
<form>
<h1 id="test">Test</h1>
</form>
Run Code Online (Sandbox Code Playgroud)
为什么这个JS工作:
console.log(test); // This outputs the <h1> element.
// Why does this work? Shouldn't `test` be undefined?
Run Code Online (Sandbox Code Playgroud)
我还没有宣布test其他地方.这种行为似乎只发生在一个内部的元素<form>.
JavaScript是否自动尝试将未定义的变量定义为:
document.getElementById('someUndefVarName')
Run Code Online (Sandbox Code Playgroud)
如下所示,以下似乎是等效的:
<div id="myUndefVar">:)</div>
<script>
alert(myUndefVar); // why does this work!?
alert(document.getElementById('myUndefVar'));
</script>
Run Code Online (Sandbox Code Playgroud)
参见JSFiddle示例:http://jsfiddle.net/AH35k/1/
或者是其他发生的事情,我不明白?这真的让我措手不及,因为我正在使用"use strict",因此我预计会出现一些错误.
我有多个跨度
<span id ="myId">data1</span>
<span id ="myId">data2</span>
<span id ="myId">data3</span>
<span id ="myId">data4</span>
<span id ="myId">data5</span>
Run Code Online (Sandbox Code Playgroud)
我想在单击按钮上删除所有范围内的文本.
我在javascript按钮单击时尝试了这个
document.getElementById("myId").innerHTML = "";
Run Code Online (Sandbox Code Playgroud)
但它只从第一个跨度中删除文本