11.02.2014, 18:46
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
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>';
Что лучше использовать? Есть ли какие-нибудь подводные камни у каждого из способов?
Последний раз редактировалось ruslan_mart, 11.02.2014 в 19:02.
|
|
11.02.2014, 19:03
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Че удобней, то и юзай. Ибо результат-то одинаковый
__________________
В личку только с интересными предложениями
|
|
11.02.2014, 19:04
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
danik.js, ну говорят, что innerHTML быстрее, однако в IE могут возникать баги и утечки памяти.
|
|
11.02.2014, 19:18
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от Ruslan_xDD
|
innerHTML быстрее, однако в IE могут возникать баги и утечки памяти.
|
это вроде в старых версиях IE было, мертвых ныне.
хотя в оном есть особенности, например п.4 http://innerhtml.ru/ , или, к примеру, опшены в селект не вставляются.
события однозначно удобнее через дом вешать.
а по скорости - да, innerHTML бывает быстрее, но тут тестить надо.
|
|
11.02.2014, 19:19
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Ruslan_xDD
|
ну говорят, что innerHTML быстрее
|
Ну и что теперь. Ну откажись от jQuery, от forEach и map, от querySelector и т.д. Ведь это все "медленное".
А ты сам-то тестил? Поищи готовые тесты на jsperf.
В хроме вообще-то уже давно innerHTML работает медленней. Возможно и файрфокс подтянулся.
__________________
В личку только с интересными предложениями
|
|
11.02.2014, 19:25
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Сообщение от danik.js
|
Ну откажись от jQuery, от forEach и map, от querySelector
|
Из этого только querySelector'ом пользуюсь. Хотя, forEach тоже бывает иногда очень полезным, чтобы цикл не писать
|
|
12.02.2014, 05:12
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Чтобы не создавать новой темы, тут же спрошу:
...
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);
Последний раз редактировалось ruslan_mart, 12.02.2014 в 05:18.
|
|
12.02.2014, 07:09
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от danik.js
|
от forEach и map, от querySelector и т.д. Ведь это все "медленное"
|
forEach и компания в хроме (т. е. у большинства пользователей, может уже и не только в хроме) уже давно рвут по скорости обычные циклы. А Object.keys+forEach уделывает for-in+hasOwnProperty. Более того сделав заказ именно сейчас Object.keys+forEach будет быстрей даже если создать объект через Object.create(null) и перебирать for-in-ом без hasOwnProperty. И все это еще и заметно удобнее. Пишу максимум циклов в таком стиле уже минимум 2 года.
Последний раз редактировалось Riim, 12.02.2014 в 07:12.
|
|
12.02.2014, 11:31
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от Ruslan_xDD
|
Почему не работает в IE?
|
возможно, до сих пор жива проблема
http://javascript.ru/ajax/transport/...sozdaem-iframe
" Создать ифрейм - так же просто, как и любой другой элемент. Пожалуй, единственная подстава - в IE свойство name должно обязательно задаваться при создании элемента.
Т.е, нельзя сначала сделать iframe, а потом присвоить ему name"
|
|
12.02.2014, 20:41
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Riim
|
forEach и компания в хроме (т. е. у большинства пользователей, может уже и не только в хроме) уже давно рвут по скорости обычные циклы.
|
разве функция внутри forEach инлайнится движком?
|
|
|
|