Что быстрее innerHTML или createElement appendChild

184
08 октября 2018, 21:20

предисловие

document.body.innerHTML = `тут очень большое дерево`

если создавать очень большое дерево, то ИМХО присвоение(=) в innerHTML быстрее чем создание дерева с помощью JS. а вот как быть с наращиванием (+=) ?

  1. один вариант

    document.body.innerHTML += `<span>что-то простое, одноуровневое</span>`
    
  2. другой

    document.body.innerHTML += `ещё одно очень большое дерево`
    

этот небольшой тест показал, что "наращивание" создаёт все элементы заново

// html - переводит Raw строку в строку. 
// а так же даёт подсветку html в VSCode с помощью плагина 
// lit-html https://marketplace.visualstudio.com/items?itemName=bierner.lit-html 
let html = (tsa, ...args) => String.raw(tsa, ...args); 
// -- 
const { counterConteiner, counter } = Counter(); 
document.body.innerHTML = ''; 
document.body.appendChild(counterConteiner); 
// -- 
void function () { 
    let i = 0; 
    class TestEl extends HTMLElement { 
        constructor() { 
            //@ts-ignore 
            super(...arguments); 
            this.id = '' + i++; 
            counter[this.id] = 0; 
        } 
        connectedCallback() { 
            counter[this.id]++; 
            this.innerHTML = `counter[${this.id}] ${counter[this.id]}`; 
        } 
    } 
    customElements.define('test-el', TestEl); 
}(); 
// ----------------- 
// -- 
let conteiner = document.createElement('div'); 
document.body.appendChild(conteiner); 
conteiner.innerHTML += html `<test-el> </test-el><br>`; 
conteiner.innerHTML += html `<span>-,-</span><br>`; 
conteiner.innerHTML += html `<span>-,-</span><br>`; 
// -- 
let test = conteiner.getElementsByTagName('test-el')[0]; 
test.remove(); 
conteiner.appendChild(test); 
// -- 
// ----------------- 
function Counter() { 
    let counter = new Proxy({}, { 
        set(target, key, value, receiver) { 
            try { 
                if (key in target) 
                    counterRender(key, value); 
                else { 
                    counterRender(); 
                    counterRender(key, value); 
                } 
                target[key] = value; 
            } 
            catch (_e) { 
                return false; 
            } 
            return true; 
        } 
    }); 
    let counterConteiner = document.createElement('table'); 
    let counterRender = (key, value) => { 
        if (value == 0) 
            return; 
        if (key) 
            counterConteiner.innerHTML += html ` 
            <tr> 
                <td>test-el id="${key}"</td> 
                <td>counts ${value}</td> 
            </tr>`; 
        else 
            counterConteiner.innerHTML += html ` 
            <tr> 
                <td>&nbsp;</td> 
                <td>&nbsp;</td> 
            </tr>`; 
    }; 
    return { counterConteiner, counter }; 
} 
//# sourceMappingURL=index.js.map

что странно, если учесть существование таких элементов как HTMLTemplateElement и DocumentFragment. (наверное, просто так положено по стандарту, и по тому же стандарту, для наращивания нужно использовать insertAdjacentHTML доки)

вопрос

не смотря на приведённый тест, вопрос ещё актуален.
что быстрее: присвоение innerHTML или создание через JS ?

и тот же вопрос, желательно с примерами, но в контексте ShadowRoot ?

READ ALSO
Как можно реализовать подобную вещь? (js, jQuery)

Как можно реализовать подобную вещь? (js, jQuery)

Как можно реализовать вот такую вещь?

229
Обход DOM дерева и изменение его элементов

Обход DOM дерева и изменение его элементов

Есть массив со значениями, необходимо обойти dom дерево и заполнить содержимое элементов c классом child-elem элементами из массиваПолучается...

154
Кнопка поделиться по email в виджете &ldquo;Блок &#171;Поделиться&#187;&rdquo; от Яндекс

Кнопка поделиться по email в виджете “Блок «Поделиться»” от Яндекс

Мне кажется нехватает информации в разделе "поделиться" пункты отправить на email(другу\себе)Как это сделать? возможно ли отправить не открывая...

151
Как парсить массив с объектами из файла

Как парсить массив с объектами из файла

есть файл, в котором лежит массив из объектовНеобходимо его обработать так, чтобы массив передался в переменную

174