Pytanie:
Jaki jest najskuteczniejszy sposób tworzenia elementów HTML za pomocą jQuery?
Odpowiedź:
Ponieważ chodzi o jQuery
to, myślę, że lepiej jest zastosować to (czyste) podejście (używasz)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
PRÓBNY.
W ten sposób można nawet używać procedur obsługi zdarzeń dla określonego elementu, takiego jak
$('<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');
PRÓBNY.
Ale gdy masz do czynienia z wieloma elementami dynamicznymi, powinieneś unikać dodawania zdarzenia handlers
do konkretnego elementu, zamiast tego powinieneś użyć delegowanego modułu obsługi zdarzeń, takiego jak
$(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');
}
PRÓBNY.
Tak więc, jeśli utworzysz i dodasz setki elementów o tej samej klasie, tj. ( myClass
), Wówczas zajmie się mniej pamięci do obsługi zdarzeń, ponieważ tylko jeden moduł obsługi będzie mógł wykonać zadanie dla wszystkich dynamicznie wstawianych elementów.
Aktualizacja: Ponieważ możemy użyć następującego podejścia do utworzenia elementu dynamicznego
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
Ale tego size
atrybutu nie można ustawić za pomocą tego podejścia za pomocą jQuery-1.8.0
lub później, a oto stary raport o błędach , spójrz ten przykład za pomocą, jQuery-1.7.2
który pokazuje, że size
atrybut jest ustawiony na 30
powyższy przykład, ale za pomocą tego samego podejścia, którego nie możemy ustawić size
za pomocą atrybutu jQuery-1.8.3
, tutaj to niedziałające skrzypce . Aby ustawić size
atrybut, możemy zastosować następujące podejście
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
Albo ten
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
Możemy przekazać attr/prop
jako obiekt podrzędny, ale to działa w jQuery-1.8.0 and later
wersjach sprawdzić ten przykład , ale to nie będzie działać w jQuery-1.7.2 or earlier
(nie testowane we wszystkich wcześniejszych wersjach).
BTW, wzięte z jQuery
raportu o błędzie
Istnieje kilka rozwiązań. Po pierwsze, wcale go nie używaj, ponieważ nie oszczędza to miejsca, a to poprawia przejrzystość kodu:
Zalecili stosowanie następującego podejścia ( działa również we wcześniejszych , przetestowano w 1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Lepiej więc zastosować to podejście, IMO. Ta aktualizacja jest wykonywana po przeczytaniu / znalezieniu tej odpowiedzi, a ta odpowiedź pokazuje, że jeśli używasz'Size'(capital S)
zamiast 'size'
niej, będzie ona działać dobrze , nawet wversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Przeczytaj także o rekwizytach , ponieważ istnieje różnica,Attributes vs. Properties
różni się w zależności od wersji.