Питання:
Який найефективніший спосіб створити HTML-елементи за допомогою jQuery?
Відповідь:
Оскільки мова йде про jQueryтоді, я думаю, що краще використовувати цей (чистий) підхід (ви використовуєте)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
DEMO.
Таким чином, ви навіть можете використовувати обробники подій для конкретного елемента, наприклад
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'style':'cursor:pointer;font-weight:bold;',
'html':'<span>For HTML</span>',
'click':function(){ alert(this.id) },
'mouseenter':function(){ $(this).css('color', 'red'); },
'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');
DEMO.
Але коли ви маєте справу з безліччю динамічних елементів, вам слід уникати додавання подій handlersконкретного елемента, натомість слід використовувати делегований обробник подій, наприклад
$(document).on('click', '.myClass', function(){
alert(this.innerHTML);
});
var i=1;
for(;i<=200;i++){
$('<div/>', {
'class':'myClass',
'html':'<span>Element'+i+'</span>'
}).appendTo('body');
}
DEMO.
Отже, якщо ви створюєте та додаєте сотні елементів з тим самим класом, тобто ( myClass), то для обробки подій буде витрачено менше пам'яті, тому що лише один обробник буде там, щоб виконувати завдання для всіх динамічно вставлених елементів.
Оновлення: оскільки ми можемо використовувати наступний підхід для створення динамічного елемента
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
Але sizeатрибут не може бути встановлений з допомогою цього підходу з використанням jQuery-1.8.0або пізніше , і тут старий звіту про помилку , подивіться на цьому прикладі , використовуючи jQuery-1.7.2який показує , що sizeатрибут встановлений з 30допомогою описаного вище прикладу , але використовуючи той же підхід , який ми не можемо набір sizeатрибутів , використовуючи jQuery-1.8.3, тут - це непрацююча скрипка . Отже, для встановлення sizeатрибуту ми можемо використовувати наступний підхід
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
Або цей
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
Ми можемо передати в attr/propякості дочірнього об'єкта , але він працює в jQuery-1.8.0 and laterверсіях перевірити цей приклад , але він не працюватиме в jQuery-1.7.2 or earlier(не тестується у всіх попередніх версіях).
BTW, взяті з jQueryповідомлення про помилку
Є кілька рішень. Перший - це взагалі не використовувати його, оскільки це не економить вам простору, і це покращує чіткість коду:
Вони радили використовувати наступний підхід ( працює і в попередніх , апробований 1.6.4)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Отже, краще використовувати такий підхід, ІМО. Це оновлення робиться після того, як я прочитав / знайшов цю відповідь, і в цій відповіді видно, що якщо ви використовуєте 'Size'(capital S)замість 'size'цього, воно буде просто добре працювати , навіть уversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Читайте також про технічну підтримку , оскільки є різниця Attributes vs. Properties, вона залежить від версій.