Учитывая, что мне нужно вставить несколько тегов, кажется, имеет смысл использовать innerHTML.
Только «несколько»? Тогда скорость не проблема. Это когда вы создаете сто, вам нужно подумать о том, что вы делаете. На самом деле это не проблема создания, это манипуляция списком дочерних узлов, которая становится все медленнее и медленнее, когда вы добавляете каждый дополнительный элемент.
Что касается добавления, у вас действительно нет выбора. Вы не можете установить innerHTML без потери существующего контента, поэтому, если вы не довольны сериализацией и повторным анализом (который уничтожает любые несериализуемые данные, такие как содержимое формы, свойства/ссылки JavaScript и обработчики событий), вы оказываетесь устанавливая внутреннийHTML другого элемента и перемещая каждый ребенок по одному за другим. Это то, что делают многие фреймворки, и обычно это заканчивается даже медленнее, чем ручной create-and-appendChild.
В зависимости от вашей ситуации (в частности: сколько дочерних узлов уже находится в целевом элементе и сколько их вы собираетесь добавить?), Можно быстрее разбить операцию на меньшие манипуляции на DocumentFragment, чьи дети может быть добавлено к детям элемента за один раз, а не один за другим. Это намного быстрее. К сожалению, невозможно установить innerHTML
на DocumentFragment.
Могут также быть более быстрые хаки с использованием объектов Range, чтобы сразу перемещать нагрузку HTML, но, к сожалению, диапазоны имеют перекрестную перекрестную переменную. Мне кажется, что кто-то должен иметь возможность быстро создать append-html из IE range.pasteHTML и W3's range.extractContents. Кто-нибудь за это?
Насколько я могу сказать, создать/добавить узел просто мешает вам создать недопустимый код
Потенциально недопустимый код не только означает ваши перерывы приложений в некоторых браузерах. Когда вы слепо сращивании вместе HTML не избежать, как идиот:
element.innerHTML= '<a href="'+url+'">'+title+'</a>';
то есть на стороне клиента межсайтовое-сценариев дыру в безопасности, которая так же плохо, как на стороне сервера один.
Вы можете, конечно, пойти на компромисс, создав элементы и установив их содержимое отдельными шагами. Например:
element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
var row= element.firstChild.rows[i];
row.cells[0].firstChild.data= urls[i];
row.cells[1].firstChild.href= urls[i];
}
(string.repeated не является стандартным JavaScript, но его использование здесь очевидно.)
Использование скорости тестовой ссылки innerHTML vs фрагменты на Win7: - Firefox 10.0.2 оба метода выполнялись примерно одинаково (каждый из них был немного быстрее каждый раз!) - Chrome (16.0.912.75 m) innerHtml был последовательно на 50% быстрее. –