Да, вот как вы должны это сделать - причина в том, что вы не просто изменяете значение одного атрибута (tagName
), вы фактически меняете весь элемент с одного типа на другой. Такие свойства, как tagName
(или nodeName
) и nodeType
доступны только для чтения в DOM и устанавливаются при создании элемента.
Итак, создание нового элемента и перемещение на место старого точно так же, как вы делаете, с DOMNode::replaceChild
, является правильной операцией.
Я не уверен, что вы подразумеваете под "нежелательным побочным эффектом обнуления всей логики, лежащей в основе управления" - если вы поясните, я мог бы дать вам руководство там.
Звучит так, как будто вы не хотите, чтобы ServerTag наследовал от DOMElement, и вместо этого вы можете захотеть связать эти два объекта с помощью некоторого другого шаблона, такого как композиция (т. Е. У ServerTag есть «DOMElement вместо« is a » DOMElement), так что вы просто заменяете объект DOMElement, связанный с вашим объектом текстового поля ServerTag.
Или более длительное предположение: у вас могут возникнуть проблемы с простым копированием атрибутов (т. Е. textarea
имеет обязательные атрибуты, такие как rows
и cols
, которых у input
нет).