1 \ При первом нажатии на элемент
его первый дочерний элемент является текстовым узлом. Это атрибут данных "2. Текст". Поэтому, когда вы ссылаетесь на this.firstChild, это текстовый узел.
2 \ Функция changeText будет вызываться с текстовым узлом в качестве параметра, поэтому «фактическим» будет текстовый узел.
Затем вы изменяете текстовый узел на текстовое поле.
3 \ Когда вы щелкаете по текстовому полю, его родительский обработчик запускается снова (щелчок
), но на этот раз this.firstChild является тегом
, поэтому функция будет вызвана с элементом ввода в качестве параметра. параметр «фактический» будет входным элементом.
Элемент ввода не имеет атрибута с именем data, поэтому в строке
textfield.setAttribute("value", actual.data);
фактические данные не определены.
Это ответ на ваш вопрос, но я чувствую желание уточнить некоторые вещи:
На самом деле вы можете использовать textfield.onclick = function () {.....}, чтобы написать функцию, которая гораздо безопаснее.
Использование onchange для изменения текстового поля обратно на текст не всегда удобно (например, если вы не хотите что-либо менять), вам следует проверить, не теряет ли элемент и его фокус (размытие).