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
状态的那些?
答案 0 :(得分:13)
Specification for input elements定义了确切的行为。从here开始阅读(在此之前,定义了DOM接口,属性和类型)。
简明摘要(value
的定义与checked
类似,因此为了简洁起见,我将仅解释value
。
“属性”value
反映value def,
“属性”value
反映了value content attribute def。
defaultValue
属性(reflected def)也是ref。措辞非常简洁。我已经跳过了一个重要的细节。此时规范非常明确,因此我将引用dirty value flag部分:
每个输入元素都有一个布尔脏值标志。脏的价值 创建元素时,flag必须初始设置为false,并且 每当用户与a中的控件交互时,必须设置为true 改变价值的方式。
value content属性给出输入的默认值 元件。添加,设置或删除值内容属性时, 如果控件的脏值标志为false,则必须设置用户代理 元素的值与value content属性的值, 如果有一个,否则为空字符串,然后运行 当前值清理算法,如果定义了一个。
答案 1 :(得分:2)
value
和checked
属性与HTML属性不对应,因此无法将其序列化为HTML。至于为什么defaultX
属性映射到x
属性,我不确定。替代方案,属性x
映射到x
属性并具有另一个属性(例如currentX
)来表示当前值,似乎稍微不那么直观,因为通常脚本将需要当前值比默认值更频繁。