DOM vs. innerHTML
Всем добрый день/вечер/ночь/утро.
Возник такой вопрос: как лучше добавлять элемены? Через createElement или innerHTML? Например, у меня есть некая моя мини-библиотека, в ней я создаю элементы так: var div = mk.create('div', {className: 'myClass', tite: 'test'}, {margin: '10px'}); var img = mk.create('img', {alt: '', src: 'test.png'}); div.appendChild(img); mk('body').appendChild(div); innerHTML: document.body.innerHTML = '<div class="myClass" title="test" style="margin:10px"><img alt="" src="test.png"></div>'; Что лучше использовать? Есть ли какие-нибудь подводные камни у каждого из способов? |
Че удобней, то и юзай. Ибо результат-то одинаковый :)
|
danik.js, ну говорят, что innerHTML быстрее, однако в IE могут возникать баги и утечки памяти. :)
|
Цитата:
хотя в оном есть особенности, например п.4 http://innerhtml.ru/ , или, к примеру, опшены в селект не вставляются. события однозначно удобнее через дом вешать. а по скорости - да, innerHTML бывает быстрее, но тут тестить надо. |
Цитата:
А ты сам-то тестил? Поищи готовые тесты на jsperf. В хроме вообще-то уже давно innerHTML работает медленней. Возможно и файрфокс подтянулся. |
Цитата:
|
Чтобы не создавать новой темы, тут же спрошу:
... mk.prototype.props = function(props) { for(var i in props) this[i] = props[i]; return this; } mk.prototype.styles = function(styles) { for(var i in styles) this.style[i] = styles[i]; return this; } ... mk.create = function(tagName, props, styles) { var elem = document.createElement(tagName); return mk(elem).props(props).styles(styles); } /*Не работает в IE (тестил в IE11)*/ var fr = mk.create('iframe', {scrolling: 'no', src: 'test.php'}); document.body.appendChild(fr); Почему не работает в IE? Другие элементы работают, а вот iframe - нет. В других браузерах всё нормально. А вот так работает: var fr = document.createElement('iframe'); fr.scrolling = 'no'; fr.src = 'test.php'; document.body.appendChild(fr); |
Цитата:
|
Цитата:
http://javascript.ru/ajax/transport/...sozdaem-iframe "Создать ифрейм - так же просто, как и любой другой элемент. Пожалуй, единственная подстава - в IE свойство name должно обязательно задаваться при создании элемента. Т.е, нельзя сначала сделать iframe, а потом присвоить ему name" |
Цитата:
|
Цитата:
|
Riim, хз как ты тестишь. Вот тут у меня в хроме forEach в 10 раз медленней for:
http://jsperf.com/for-vs-foreach/132 |
Цитата:
var i = 500000, arr = []; while (i--) { arr.push(i); } var sum = 0, st = Date.now(); arr.forEach(function(num) { sum += num; }); console.log(Date.now() - st); sum = 0; st = Date.now(); function add(num) { sum += num; } arr.forEach(add); console.log(Date.now() - st); sum = 0; st = Date.now(); for (var j = 0, l = arr.length; j < l; j++) { sum += arr[j]; } console.log(Date.now() - st); sum = 0; st = Date.now(); for (var j = 0; j < arr.length; j++) { sum += arr[j]; } console.log(Date.now() - st); результат в хроме: 736 85 2496 2608 в ff: 657 590 871 913 пробовал переставлять тесты местами, пробовал отдельно генерить массив и далее отдельно запускать каждый тест. Проверь, мож я где затупил жестко. jsperf выдает результат схожий с твоим, странно как-то. |
ну вот, если запускать не из консоли, результат меняется, обидно :( , кажись придется иногда обычные циклы писать.
|
Цитата:
|
Цитата:
|
Цитата:
Кошерный функциональный стиль со скоростью циклов + прозрачная работа с LocalStorage/IndexedDB Сравнения: https://github.com/kobezzza/Collecti...aster/profiler |
Цитата:
|
kobezzza,
то что вы пишите я совсем непонимаю 98%, надеюсь на озарение ))), но немогли бы вы обьяснить, если можно что значит это: Цитата:
|
Цитата:
Чтобы запустить нужно склонить к себе репозитарий: git clone git://github.com/kobezzza/Collection.git А затем запускать .html файлики, например: forEach.html *** Сама Collection - это микролиба которая предоставляет унивесальный итераторный API для любых типов данных и работает как правило значительно быстрее нативных методов, т.к. основана на кодогенерации циклов в real-time с кучей оптимизаций. http://javascript.ru/forum/project/4...tml#post295370 Пример: сравнение forEach в хроме (время в мс): *** Циклы for (i = 0; i < length; i++) 99 for (i = length; i--; ) 78 for (i = 0; i < length; i++) с функцией 81 for (i = 0; i < length; i++) с функцией в Function 86 for (i = -1; (i += 1) < length; ) 83 *** Итераторы Array.prototype.forEach 348 jQuery.each 487 Underscore.each 345 *** Collection $C().forEach 131 |
kobezzza,
Цитата:
я как раз и хотел узнать как запустить код что я вижу по ссылке https://github.com/kobezzza/Collection/blob/master/profiler/forEach.html а нельзя как нибудь попроще ? сейчас я вижу один тупой путь -- копировать код что вижу и искать в гугле недостающие файлы типа collection.min.js :( |
Цитата:
Потрать день на изучение - там нет ничего сложного. *** Собранная либа лежит в папке: https://github.com/kobezzza/Collecti...e/master/build ЗЫ: установку можно также сделать с помощью NPM или Bower https://github.com/kobezzza/Collecti...B2%D0%BA%D0%B0 |
Цитата:
|
рони, не волнуйся, ты не один такой. :)
|
Ну вы ребят даёте :)
Знание системы контроля версий является обязательным при приёме в любую серьёзную контору, причём в большинстве случаев это либо Git, либо SVN, а ну а ак на гитхабе - это самое лучшее портфолию для js-прогера. И самое главное, что там реально ничего нет сложного + есть большое количество туториалов на русском и даже книга про это дело. |
Во-во, тоже очень удивился, куда сейчас без git
Айн: http://githowto.com/ru/ Цвай: http://habrahabr.ru/post/125799/ |
Цитата:
|
Цитата:
|
Makarov,
kobezzza, :write: ок! |
Цитата:
|
Цитата:
|
kobezzza,
Цитата:
объясни что ты имеешь ввиду говоря Цитата:
|
Цитата:
К тому же базовые массивы JS поддерживают "дырки", что ещё сильнее усложняет логику работы JIT компилятора и кстати это один из главных аргументов гугл против JS :) Но тем ни менее в JS есть и настоящие массивы: https://developer.mozilla.org/en-US/...t/Typed_arrays *** Если посмотреть стандарт про новые arrow function в JS, то можно увидеть, что внутри них не поддерживается ссылка arguments, который является виновником многих тормозов, т.к. не позволяет JIT делать многие оптимизации. К слову в моём Collection оптимизация arguments идёт всегда, т.е. в callback передаются только те параметры, которые явно декларированы в описание функции, т.е.: $C([]).forEach(function () { console.log(arguments); // [] }); $C([]).forEach(function (el) { console.log(arguments); // [el] }); Т.е. если забыть продекларировать все нужные параметры и использовать arguments, то можно словить баг, но это очень сильно ускоряет работу итератора, а вот нативный JIT такую штуку сделать не может, т.к. она приводит к потенциальной ошибке. |
kobezzza,
теперь хоть понятно зачем твоя либа нужна, а то когда первый раз прочитал про нее, подумал что заняться тебе нечем). |
Цитата:
|
Часовой пояс GMT +3, время: 20:43. |