Если вы используете PrototypeJS, вы также можете добавить script.aculo.us в ваш проект. Конструктор в script.aculo.us предоставляет хороший способ построения сложных структур DOM, например:
var myList = Builder.node("ul", {
id: "dom_a"
},[
Builder.node("li", "foo"),
Builder.node("li", "bar"),
]);
После этого вы можете вставить этот объект, который должен отображаться как HTML, в любом месте DOM с любыми функциями вставки / обновления (из PrototypeJS) или даже стандартным JavaScript appendChild.
$("my_div").insert({After: myList});
Обратите внимание, что в PrototypeJS вставка поставляется в 4 различных режимах: After, Before, Top и Bottom. Если вы используете вставку без указания «mode», как указано выше, по умолчанию будет «Bottom». То есть новый код DOM будет добавлен ниже существующего содержимого элемента контейнера как innerHTML. Top сделает то же самое, но добавит его поверх существующего содержимого. До и после - это также классные способы добавления в DOM. Если вы используете их, содержимое будет добавлено в структуру DOM до и после элемента контейнера, а не внутри как innerHTML.
Однако в Builder есть одна вещь, о которой нужно помнить: ладно, две вещи на самом деле:
я. Вы не можете ввести необработанный HTML в объект как контент ... Это не удастся:
Builder.node("ul", "<li>foo</li>");
II. Когда вы указываете атрибуты узла, имейте в виду, что вы должны использовать className для обозначения класса атрибута HTML (и, возможно, также htmlFor для для атрибута ... хотя для атрибута кажется устаревшим в HTML5 (?), Но кто не хочет использовать это для этикеток)
Builder.node("ul", {
id: "dom_a",
className: "classy_list"
});
Я знаю, что вы чесаете голову из-за пункта i. > Что, без сырого HTML, черт!
Не беспокоиться. Если вам все еще нужно добавить контент, который может содержать HTML, в DOM, созданном Builder, просто сделайте это на втором этапе, используя вставку ({Before / After / Top / Bottom: string}). Но почему вы хотите сделать это в первую очередь? Было бы неплохо, если бы вы написали функцию «раз и навсегда», которая генерирует все виды элементов DOM, а не встраивает во все виды строк. Первый подход был бы аккуратным и элегантным. Это что-то вроде встроенного стиля в сравнении с типом вопроса. Хороший дизайн должен, в конце концов, отделять контент от meta content или форматирования разметки / markdown.
И последнее, что нужно держать под рукой в вашем наборе инструментов, - это обход DOM Protype в случае, если вы хотите динамически вставлять и удалять контент, такой как HTML Houdini. Проверьте Элемент следующим, вверх, вниз, предыдущие методы. Кроме того, $$ также интересно использовать, особенно если вы знаете селекторы CSS3.