为什么某些技术上可序列化的输入属性不能序列化?

IT技术 javascript html dom
2021-03-05 01:38:22

可序列化属性定义为:

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

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

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

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

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

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

2个回答

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

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

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

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

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

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

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

太好了,我可以在这里演示。jsfiddle.net/Psb2Z/1使标志变脏后,设置属性无效。
2021-05-13 01:38:22

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

是的,"value"and"checked"属性实际上映射到.defaultValueand .defaultChecked所以会有冲突。所以真正有趣的问题是为什么选择这些而不是当前的。我认为 Felix Kling 的理论非常有趣。
2021-05-07 01:38:22
@Esalija:Felix 的理论符合我长期以来的假设,尽管我从未见过明确的解释。我觉得我可能遗漏了一些明显的东西。
2021-05-07 01:38:22