Вопрос:
Каков наиболее эффективный способ создания элементов 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
(не тестируется во всех предыдущих версиях).
Кстати, взято из 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
, она варьируется в зависимости от версии.