Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';难道我们不能在JavaScript中使用元素ID作为标识符吗?_Javascript_Dom_Getelementbyid - Fatal编程技术网

为什么不';难道我们不能在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元素。
资料来源:我的重点

基于此,遵守标准并不是避免这种模式的理由。但是,规范本身建议不要使用:

一般来说,依赖这一点会导致代码脆弱。哪个 随着新特性的增加,最终映射到此API的ID可能会随着时间的推移而变化 例如,添加到Web平台。使用
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”
    名称