Питання:
Який найефективніший спосіб створити 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
, вона залежить від версій.