if(node.nextSibling && node.nextSibling.nodeName.toLowerCase() === "tr")
Для чего это нужно? Я не думаю, что вам это нужно. Если node.nextSibling имеет значение null, это не имеет значения. Вы можете передать это в insertBefore, и он будет действовать так же, как appendChild.
И в теле нет другого элемента, кроме 'tr'.
for(var i = 0; i < rows.length; i++){
tbody.insertBefore(rows[i], node.nextSibling);
Это не будет работать для нескольких строк. После того как вы сделали один insertBefore, node.nextSibling теперь будет указывать на строку, которую вы только что вставили; в итоге вы вставите все строки в обратном порядке. Вам нужно будет запомнить оригинал nextSibling.
ETA: плюс, если «row» - это живой NodeList DOM, каждый раз, когда вы вставляете одну из строк в новое тело, она удаляет ее из старого тела! Таким образом, вы уничтожаете список по мере его перебора. Это частая причина ошибок «всех остальных»: вы обрабатываете элемент 0 списка и при этом удаляете его из списка, перемещая элемент 1 туда, где находился элемент 0. Затем вы получаете доступ к новому элементу 1, который является исходным элементом 2, и оригинальный элемент 1 никогда не виден.
Либо сделайте копию списка в обычном неживом «массиве», либо, если вы знаете, что это будет живой список, вы можете использовать более простую форму цикла:
var parent= node.parentNode;
var next= node.nextSibling;
while (rows.length!=0)
parent.insertBefore(rows[0], next);
Мне нужно вставить набор.
Обычно, когда вы думаете о вставке набора элементов одновременно, вы хотите использовать DocumentFragment. Однако, к сожалению, вы не можете установить «innerHTML» для DocumentFragment, поэтому вам нужно будет установить строки в таблице, как указано выше, а затем переместить их одну за другой в DocumentFragment, а затем вставить «перед DocumentFragment». Хотя теоретически это может быть быстрее, чем добавление в окончательную целевую таблицу (из-за меньшего количества сбоев в списках дочерних узлов), на практике, по моим тестам, это на самом деле не значительно надежнее.
Другим подходом является insertAdjacentHTML, метод расширения только для IE. К сожалению, нельзя вызвать insertAdjacentHTML для дочернего элемента tbody, так же как вы не можете установить tbody.innerHTML из-за ошибки IE. Вы можете установить его внутри DocumentFragment:
var frag= document.createDocumentFragment();
var div= document.createElement(div);
frag.appendChild(div);
div.insertAdjacentHTML('afterEnd', html);
frag.removeChild(div);
node.parentNode.insertBefore(frag, node.nextSibling);
К сожалению, каким-то таинственным образом почему-то очень медленно работает insertAdjacentHTML в этом контексте. Вышеуказанный метод для меня составляет примерно половину скорости вставки один за другим. : - (