Почему не сериализуются некоторые технически сериализуемые входные свойства?

Свойство Serializable определяется как:

  • Когда вы устанавливаете свойство элемента, оно будет отражено в запросах сериализации, таких как getAttribute и вы можете увидеть изменения в DOM Inspector
  • Когда вы получаете .innerHTML элемента элемента, возвращаемая строка html будет содержать все сериализуемые свойства в качестве их атрибутов

Я сделал страницу, которая похожа на надежную печать таблицы всех сериализуемых свойств input элемента в Chrome и Firefox: http://jsfiddle.net/tEVLp/16/. Пользовательские свойства никогда не могут быть сериализованы, поэтому в firefox webkitSpeech т.д. Не являются сериализуемыми. Тест на хром для достижения наилучших результатов.

Все логические значения true потому что сериализация false свойства будет отсутствием атрибута, который является ложным отрицательным в тесте.

Поэтому мой вопрос: почему не такие свойства, как .value и .checked serializable?

Технически оба являются сериализуемыми. .value - это просто строка, и браузер не имеет проблем с сериализацией других логических свойств, таких как .readOnly и .disabled.

Мое лучшее предположение заключается в том, что поскольку .defaultValue сериализуется для "value" -attribute и .defaultChecked сериализуется для "checked" -attribute, возник конфликт, и поэтому значения .value и .checked не могут быть сериализованы. В этом случае, почему defaultX выбранные по defaultX, а не те, которые отражают более полезные текущие значения .value и .checked?

Ответы

Ответ 1

Спецификация для элементов ввода определяет точное поведение. Начните читать с здесь (до этого определяются интерфейс DOM, атрибуты и типы).

Краткая сводка (value определяется аналогично checked, поэтому для краткости я буду объяснять только value).

"Свойство" value отражает значение def,
"атрибут" value отражает атрибут content value def.

  • Атрибут определяет свойство значения по умолчанию (ref). Это значение также отражает def с помощью свойства defaultValue (ref).
  • Когда атрибут value установлен, изменяется свойство value (ref) *.

Это было сформулировано очень кратко. Я пропустил важную деталь. Спецификация очень понятна на данный момент, поэтому я просто приведу флаг:

Каждый элемент ввода имеет логическое значение флага. Грязное значение перед созданием элемента флаг должен быть установлен в значение false должно быть установлено в true, когда пользователь взаимодействует с элементом управления в способ, который изменяет значение.

Атрибут content value дает значение по умолчанию для ввода элемент. Когда атрибут content value добавляется, устанавливается или удаляется, если флаг управляющего грязного значения является ложным, пользовательский агент должен установить значение элемента для значения атрибута content value, если он есть, или пустая строка в противном случае, а затем запустите алгоритм дезинфекции текущего значения, если он определен.

Ответ 2

value и checked свойства не соответствуют атрибутам HTML, поэтому они не могут быть сериализованы в HTML. Что касается того, почему свойство defaultX отображает атрибут x, я не уверен. Альтернатива, свойство x сопоставление с атрибутом x и наличие другого свойства, такого как currentX для представления текущего значения, выглядит несколько менее интуитивно понятным, поскольку в общем случае script потребуется текущее значение чаще чем значение по умолчанию.