Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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 元素与x27之间关系背后的设计原因;s属性及其对应属性_Javascript_Jquery_Html_Dom_Properties - Fatal编程技术网

Javascript 元素与x27之间关系背后的设计原因;s属性及其对应属性

Javascript 元素与x27之间关系背后的设计原因;s属性及其对应属性,javascript,jquery,html,dom,properties,Javascript,Jquery,Html,Dom,Properties,我对某些DOM元素的属性与其对应的属性之间的关系如何工作的背后的原因感到困惑 下面是《2015年Bear Bibeault行动中的jquery》一书中的一个图表,显示了DOM元素的属性和属性之间的关系 为了进一步解释这个概念,作者有以下代码和代码解释 我的问题是,为什么一些属性和属性被同步,为什么一些不同步,为什么一些属性没有相应的属性 我找到了一个解释属性和属性之间关系的方法,但它没有涉及到为什么要这样设计。我希望了解设计背后的原因 一个相关的问题,如果我想获取或设置DOM元素的值,我应

我对某些DOM元素的
属性
与其对应的
属性
之间的关系如何工作的背后的原因感到困惑

下面是《2015年Bear Bibeault行动中的jquery》一书中的一个图表,显示了DOM元素的属性和属性之间的关系

为了进一步解释这个概念,作者有以下代码和代码解释

我的问题是,为什么一些
属性
属性
被同步,为什么一些不同步,为什么一些
属性
没有相应的
属性

我找到了一个解释
属性
属性
之间关系的方法,但它没有涉及到为什么要这样设计。我希望了解设计背后的原因

一个相关的问题,如果我想获取或设置DOM元素的值,我应该获取/设置
属性
还是
属性


当需要时,我们如何找到特定的
属性
与其对应的
属性
之间的关系?是否有详细说明关系的文件

DOM是一种“自然”发展到很大程度的东西。你必须考虑,HTML(含义:属性)是第一个,最初根本没有脚本。最终,Netscape将JavaScript引入了你今天认为非常有限的API。此API面向操作表单,而不是真正任意的HTML元素。然后Netscape和InternetExplorer推出了不同的DHTML变体(动态HTML)。Netscape的变种依赖于一个特殊的
标签,现在没有人记得它。InternetExplorer变体允许更通用地访问HTML元素,尤其是属性与属性的1:1映射

虽然Internet Explorer赢得了这场战争,但它的DHTML变体是在人们将HTML属性名称视为固定集合时设计的。由于具有任意属性,它有太多问题。例如:

  • class
    属性最初无法映射到JavaScript,因为
    class
    是保留关键字。虽然对JavaScript标准的后续更改允许使用保留关键字作为属性名,但Internet Explorer必须将
    class
    属性映射到
    className
    属性。在元素上设置
    className
    属性,或在JavaScript对象上设置
    el[“class”]
    属性,都会导致可笑的不一致
  • HTML属性不区分大小写,而JavaScript属性区分大小写。所以Internet Explorer有各种各样的黑客来识别其意图。当元素是
    并且您试图从JavaScript访问
    el.someAttribute
    el.someAttribute
    时发生了什么?我已经不记得了,但它并不漂亮
  • JavaScript对象也总是有方法。例如,属性
    toString
    不可能映射到属性,因为它会屏蔽
    toString()
    方法
除了Internet Explorer之外,没有其他浏览器实现过这种属性到属性的1:1映射,甚至Internet Explorer在向后兼容性方面可行时也放弃了它(这花费了很长时间)。相反,属性和属性现在被视为单独的名称空间。浏览器将为您提供一些属性作为属性访问和操作的快捷方式,但它们实际上只是为了方便您。还有一些向后兼容的情况让事情变得一团糟:
value
属性和
value
属性实际上没有相互映射,前者反映元素的当前状态,而后者反映元素的初始状态

编辑:您引用以下语句仅供参考:

如果属性作为内置属性存在,但它是布尔值,则该值不同步

这是错误的,行为与布尔和字符串无关。如上所述,
属性与选中的
属性一样缺少同步。另一方面,布尔
hidden
属性将与相应的属性正确同步。据我所知,在Netscape引入的原始表单操作API中,您会发现属性和属性之间缺少同步—这只是向后兼容


所以,也许你不应该相信那些用DOM问题编写jQuery书籍的人。毕竟,他们明确地选择了不直接接触DOM,而是选择了一种完全不同的表示方式,有着自己的一套怪癖。

你会发现答案隐藏在HTML规范中。我首先想让您看看(标题“内容属性”和“DOM接口”)的属性和属性,以及关于(第一段)的部分

您将注意到,所有属性都有相应的属性,操作属性将更改其反映的属性。值得注意的是:

(1) 属性可以由名称稍有不同的属性反映。经典示例是
class
属性,该属性由
className
属性反映,而
for
属性由
htmlFor
属性反映

(2) 同样地,表示复选框的内部状态,而与
已选中的属性无关。这总是在程序员(和书籍作者)中引起混乱
document.getElementById("div-1").title = "Hello";
document.getElementById("div-1").setAttribute("title") = "Hello";
<input type="checkbox" id="checkbox-1">
document.getElementById("checkbox-1").defaultChecked = true;
document.getElementById("checkbox-1").setAttribute("checked", "checked");
<input type="checkbox" id="checkbox-1" checked="checked">
document.getElementById("checkbox-1").checked = true;