为什么不';难道我们不能在JavaScript中使用元素ID作为标识符吗?
我使用的所有浏览器都允许通过编写以下内容访问具有为什么不';难道我们不能在JavaScript中使用元素ID作为标识符吗?,javascript,dom,getelementbyid,Javascript,Dom,Getelementbyid,我使用的所有浏览器都允许通过编写以下内容访问具有id=“myDiv”的元素: myDiv 请看这里: 无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它,而是假设人们会使用它 document.getElementById("myDiv") 或许 document.querySelector("#myDiv") 访问DOM元素,即使其ID事先已知(即在运行时未计算)。我可以看出,如果有人无意中试图在更大的范围内重新定义myDiv(虽然这不是一个好主意…),用不同的
id=“myDiv”
的元素:
myDiv
请看这里:
无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它,而是假设人们会使用它
document.getElementById("myDiv")
或许
document.querySelector("#myDiv")
访问DOM元素,即使其ID事先已知(即在运行时未计算)。我可以看出,如果有人无意中试图在更大的范围内重新定义myDiv
(虽然这不是一个好主意…),用不同的值覆盖它,并且在没有注意到冲突的情况下继续,那么后一种方法的优点是保持代码安全
但是其他的呢?除了代码设计之外,在使用上面的简短形式时是否还有其他问题,或者我在这里遗漏了什么
无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它[…]
撇开对隐式声明的全局变量的依赖不谈,缺少文档是不使用它的一个重要原因
将id
值明显提升为全局变量是不符合标准的(没有提及),因此,您不应该假设未来的浏览器将实现它
编辑:事实证明这种行为符合标准-在HTML5中,window
应该支持对“命名元素”的属性访问:
出于上述算法的目的,具有名称的命名对象是:
- 名称为name的活动文档的子浏览上下文
- a、 小程序、区域、嵌入、表单、框架集、img或具有 值为名称的名称内容属性,或
- 具有值为name的id-content属性的HTML元素。
document.getElementById()
或document.querySelector()
有几个原因: 您不希望代码和标记耦合在一起 通过使用特定的调用访问div,您不必担心全局空间被破坏。添加一个在全局空间中声明
myDiv
的库,您将陷入一个难以修复的痛苦世界
您可以通过ID访问不属于DOM的元素
它们可以位于片段、框架或已分离但尚未重新连接到DOM的元素中
编辑:通过ID
var frag=document.createDocumentFragment();
var span=document.createElement(“span”);
span.id=“span测试”;
附件碎片(span);
var span2=框架getElementById(“跨度测试”);
警报(span==span2)代码>好问题。爱因斯坦可能没有说过,事情应该尽可能简单,而不是简单
如果有人无意中试图在更大的范围内重新定义myDiv(虽然这不是一个好主意……),用一些不同的值覆盖myDiv,并且在没有注意到冲突的情况下继续,则后一种方法的优点是保持代码安全
这就是为什么这是一个坏主意的主要原因,而且已经足够了。依赖全局变量是不安全的。它们可以随时被页面上运行的任何脚本覆盖
除此之外,仅仅键入myDiv
并不是document.getElementById()的“缩写形式”
。它是对全局变量的引用。document.getElementById()
如果元素不存在,将愉快地返回null
,而尝试访问不存在的全局变量将抛出引用错误,因此您需要将对全局变量的引用封装在try/catch块中以确保安全
这就是jQuery如此流行的一个原因:如果您执行$(“#myDiv”).remove()
,并且没有id为myDiv
的元素,则不会抛出错误-代码只会静默地不做任何事情,这通常正是您在执行DOM操作时想要的。在我的例子中,我的页面中有一个iframe。我被id
attribute和name
attribute搞糊涂了,这两个变量都影响了名为internal\u iframe
的变量,可从窗口访问
- 如果我只使用了id属性,比如
id=“internal\u iframe”
,窗口。internal\u iframe
是一个htmliframe元素
。属性包括和internal\u iframe.contentWindow
*
- 在这种情况下,我假设变量出现在
窗口上
,原因如下:
具有值为name的idcontent属性的HTML元素
- 如果我只使用了名称属性,比如
name=“internal\u iframe”
,那么窗口。internal\u iframe
是一个“frame”,也称为一个contentWindow
,因此name属性internal\u iframe没有属性contentDocument
或contentWindow
- 我假设
internal\u iframe
变量出现在窗口上
就是因为这个原因
name为name的活动文档的子浏览上下文
- 如果我使用了两个
名称和id
属性,并且我给了两个属性相同的值name=“internal_iframe”id=“internal iframe”
;名称