Почему не сериализуются некоторые технически сериализуемые входные свойства?
Свойство 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 потребуется текущее значение чаще чем значение по умолчанию.