一尘不染

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

html

可序列化属性定义为:

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

我制作了一个页面,看起来好像它已经可靠地打印了inputChrome和Firefox
中该元素的所有可序列化属性的表://jsfiddle.net/tEVLp/16/。自定义属性从不可序列化,因此在firefox
webkitSpeech等中不可序列化。测试镀铬以获得最佳结果。

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

所以我的问题是,为什么没有诸如.valueand可.checked序列化的属性?

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

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


阅读 301

收藏
2020-05-10

共1个答案

一尘不染

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

简洁的摘要(value定义与相似checked,因此为简洁起见,我value仅作解释)。

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

  • 该属性定义默认值属性(ref)。该值也反映DEF由defaultValue属性(REF)。
  • 设置value属性后,value属性将更改(ref)*。
    措词非常简洁。我跳过了一个重要的细节。此时,规范非常清晰,因此我只引用脏值标志部分:

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

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

2020-05-10