12

可序列化的属性定义为:

  • 当您设置元素的属性时,它将反映在序列化查询中getAttribute,您可以在 DOM Inspector 中看到更改
  • 当您获取.innerHTML元素的父节点时,返回的 html 字符串将包含所有可序列化的属性作为它们的对应属性

我制作了一个页面,看起来它可靠地打印了inputChrome 和 Firefox 中元素的所有可序列化属性的表格:http: //jsfiddle.net/tEVLp/16/。自定义属性永远不可序列化,因此在 FirefoxwebkitSpeech等中不可序列化。测试铬以获得最佳效果。

所有布尔值都是true因为属性的序列化false将缺少属性,这在测试中是假阴性。

所以我的问题是,为什么不能序列化.value.checked可序列化的属性?

从技术上讲,两者都是可序列化的。.value只是一个字符串,浏览器在序列化其他布尔属性方面没有问题,例如.readOnlyand .disabled

我最好的猜测是,由于.defaultValue序列化为"value"-attribute 并.defaultChecked序列化为"checked"-attribute,因此会有冲突,因此 .valueand.checked无法序列化。在那种情况下,为什么defaultX选择这些而不是反映更有用的当前.value.checked状态的那些?

4

2 回答 2

13

输入元素的规范定义了确切的行为。从这里开始阅读(在此之前,定义了 DOM 接口、属性和类型)。

简明摘要(value定义类似于checked,因此为简洁起见,我将value仅解释)。

“属性”value反映def
“属性”value反映值内容属性def

  • 该属性定义了默认值属性( ref )。该值也由属性 ( ref )反映defaultValue
  • 设置 value 属性后, value 属性会更改 ( ref ) *。

那是非常简洁的措辞。我跳过了一个重要的细节。规范在这一点上非常清楚,所以我只引用脏值标志部分:

每个输入元素都有一个布尔脏值标志。脏值标志必须在创建元素时初始设置为 false,并且在用户以更改值的方式与控件交互时必须设置为 true。

value 内容属性给出了输入元素的默认值。在添加、设置或删除 value 内容属性时,如果控件的脏值标志为 false,则用户代理必须将元素的值设置为 value 内容属性的值,如果有,则为空字符串否则,然后运行当前值清理算法(如果已定义)。

于 2012-08-02T14:20:19.337 回答
2

valuechecked属性与 HTML 属性不对应,因此它们无法序列化为 HTML。至于为什么defaultX属性映射到x属性,我不确定。另一种方法是属性x映射到x属性并具有另一个属性(例如currentX表示当前值),这似乎不太直观,因为通常脚本需要当前值而不是默认值。

于 2012-08-02T14:01:05.383 回答