Вы должны будете использовать Object.defineProperty в HTMLElement.prototype, чтобы переопределить метод установки и получения innerHTML своей собственной реализацией innerHTML, которая обрабатывает требуемые элементы как void . Посмотрите здесь , чтобы узнать, как innerHTML и анализатор HTML реализованы по умолчанию.
Обратите внимание, что Firefox отстой в наследовании, когда дело доходит до определения вещи в HTMLElement.prototype, где он фильтруется, например, до HTMLDivElement. В Opera все должно работать нормально.
Другими словами, то, какие элементы являются недействительными, зависит от парсера HTML. Синтаксический анализатор следует этому списку , и innerHTML в основном использует те же правила.
Итак, другими словами, если вы не хотите создавать свою собственную реализацию innerHTML в JS, вам, вероятно, следует просто забыть об этом.
Вы можете использовать live DOM Viewer , чтобы показать другим, как анализируется определенная разметка. Затем вы, вероятно, заметите, что те же самые конечные теги неявно закроют открытый элемент.
У меня есть какой-то устаревший код getHetML (не для установщика) здесь , в котором используется список элементов void. Это может дать вам некоторые идеи. Но написание реализации сеттера может быть более сложным.
С другой стороны, если вы используете createElement (), appendChild () и т. Д. Вместо innerHTML, вам не нужно беспокоиться об этом, а собственный метод получения innerHTML выведет неизвестные элементы с конечными тегами.
Обратите внимание, что вы можете рассматривать неизвестный элемент как xml и использовать XMLSerializer () и DOMParser () для выполнения действий:
var x = document.createElement("test");
var serializer = new XMLSerializer();
alert(serializer.serializeToString(x));
var parser = new DOMParser();
var doc = parser.parseFromString("<test/>", "application/xml");
var div = document.createElement("div");
div.appendChild(document.importNode(doc.documentElement, true));
alert(serializer.serializeToString(div));
Это не совсем то, что вы хотите, но то, с чем вы можете играть. (Проверьте это в Opera вместо Firefox, чтобы увидеть разницу с атрибутами xmlns. Также обратите внимание, что Chrome не похож на Opera и Firefox.)