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

时间:2012-08-02 13:09:56

标签: javascript html dom

Serializable属性定义为:

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

我创建了一个页面,看起来它能够可靠地打印Chrome和Firefox中input元素的所有可序列化属性的表:http://jsfiddle.net/tEVLp/16/。 自定义属性永远不可序列化,因此在firefox webkitSpeech等中不可序列化。在铬合金中测试以获得最佳效果。

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

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

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

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

2 个答案:

答案 0 :(得分:13)

Specification for input elements定义了确切的行为。从here开始阅读(在此之前,定义了DOM接口,属性和类型)。

简明摘要(value的定义与checked类似,因此为了简洁起见,我将仅解释value

“属性”value反映value def
“属性”value反映了value content attribute def

  • 该属性定义默认值属性refdefaultValue属性(reflected def)也是ref
  • 设置value属性后,value属性会更改(ref)*。

措辞非常简洁。我已经跳过了一个重要的细节。此时规范非常明确,因此我将引用dirty value flag部分:

  

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

     

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

答案 1 :(得分:2)

valuechecked属性与HTML属性不对应,因此无法将其序列化为HTML。至于为什么defaultX属性映射到x属性,我不确定。替代方案,属性x映射到x属性并具有另一个属性(例如currentX)来表示当前值,似乎稍微不那么直观,因为通常脚本将需要当前值比默认值更频繁。