Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2014, 18:46
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2014, 19:03
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Че удобней, то и юзай. Ибо результат-то одинаковый
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 11.02.2014, 19:04
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

danik.js, ну говорят, что innerHTML быстрее, однако в IE могут возникать баги и утечки памяти.
Ответить с цитированием
  #4 (permalink)  
Старый 11.02.2014, 19:18
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от Ruslan_xDD
innerHTML быстрее, однако в IE могут возникать баги и утечки памяти.
это вроде в старых версиях IE было, мертвых ныне.
хотя в оном есть особенности, например п.4 http://innerhtml.ru/ , или, к примеру, опшены в селект не вставляются.

события однозначно удобнее через дом вешать.

а по скорости - да, innerHTML бывает быстрее, но тут тестить надо.
Ответить с цитированием
  #5 (permalink)  
Старый 11.02.2014, 19:19
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Ruslan_xDD
ну говорят, что innerHTML быстрее
Ну и что теперь. Ну откажись от jQuery, от forEach и map, от querySelector и т.д. Ведь это все "медленное".

А ты сам-то тестил? Поищи готовые тесты на jsperf.
В хроме вообще-то уже давно innerHTML работает медленней. Возможно и файрфокс подтянулся.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 11.02.2014, 19:25
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Сообщение от danik.js
Ну откажись от jQuery, от forEach и map, от querySelector
Из этого только querySelector'ом пользуюсь. Хотя, forEach тоже бывает иногда очень полезным, чтобы цикл не писать
Ответить с цитированием
  #7 (permalink)  
Старый 12.02.2014, 05:12
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 12.02.2014, 07:09
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 12.02.2014, 11:31
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от Ruslan_xDD
Почему не работает в IE?
возможно, до сих пор жива проблема
http://javascript.ru/ajax/transport/...sozdaem-iframe

"Создать ифрейм - так же просто, как и любой другой элемент. Пожалуй, единственная подстава - в IE свойство name должно обязательно задаваться при создании элемента.
Т.е, нельзя сначала сделать iframe, а потом присвоить ему name
"
Ответить с цитированием
  #10 (permalink)  
Старый 12.02.2014, 20:41
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Riim Посмотреть сообщение
forEach и компания в хроме (т. е. у большинства пользователей, может уже и не только в хроме) уже давно рвут по скорости обычные циклы.
разве функция внутри forEach инлайнится движком?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
инициализация плагинов до вставки html-я в DOM FanAizu jQuery 3 19.01.2014 01:16
Проблема select innerHTML adamsalex AJAX и COMET 0 02.04.2012 11:46
Новый элемент отсутствует в DOM модели StrSprut jQuery 4 19.09.2011 12:50
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
DOM vs iframe. Как в ифрейме заменить выделенный текст (его innerHTML)? Бухалыч Events/DOM/Window 4 20.08.2009 14:30