Refaktoryzuję stary kod JavaScript i dzieje się wiele manipulacji DOM.
var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;
var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);
Chciałbym wiedzieć, czy istnieje lepszy sposób na wykonanie tego za pomocą jQuery. Eksperymentowałem z:
var odv = $.create("div");
$.append(odv);
// And many more
Ale nie jestem pewien, czy to jest lepsze.
Odpowiedzi:
Oto twój przykład w linii „jeden”.
Aktualizacja : Myślałem, że zaktualizuję ten post, ponieważ nadal generuje duży ruch. W komentarzach poniżej jest trochę dyskusji na temat
$("<div>")
vs$("<div></div>")
vs$(document.createElement('div'))
jako sposobu tworzenia nowych elementów i który jest „najlepszy”.Złożyłem mały test porównawczy , a oto z grubsza wyniki powtarzania powyższych opcji 100 000 razy:
jQuery 1.4, 1.5, 1.6
jQuery 1.3
jQuery 1.2
Myślę, że nie jest to duża niespodzianka, ale
document.createElement
jest najszybszą metodą. Oczywiście, zanim odejdziesz i zaczniesz refaktoryzować całą bazę kodu, pamiętaj, że różnice, o których tutaj mówimy (we wszystkich, oprócz archaicznych wersji jQuery), wynoszą około 3 dodatkowe milisekundy na tysiąc elementów .Aktualizacja 2
Zaktualizowano dla jQuery 1.7.2 i umieściłem test porównawczy,
JSBen.ch
który jest prawdopodobnie bardziej naukowy niż moje prymitywne testy porównawcze, a ponadto można go teraz gromadzić w crowdsourcingu!http://jsben.ch/#/ARUtz
źródło
$('div')
który jest wizualnie bardzo podobny, ale funkcjonalnie różni się między sobą .$(document.createElement('div'))
i powinna być najszybsza?Po prostu dostarczając HTML elementów, które chcesz dodać do konstruktora jQuery
$()
, zwróci obiekt jQuery z nowo zbudowanego HTML, odpowiedni do dołączenia do DOM przy użyciuappend()
metody jQuery .Na przykład:
Możesz następnie wypełnić tę tabelę programowo, jeśli chcesz.
Daje to możliwość określenia dowolnego dowolnego kodu HTML, w tym nazw klas lub innych atrybutów, które mogą być bardziej zwięzłe niż używanie,
createElement
a następnie ustawianie atrybutów takich jakcellSpacing
iclassName
za pomocą JS.źródło
$(htmlStr)
jest implementowany jakodocument.createElement("div").innerHTML = htmlStr
. Innymi słowy, wywołuje parser HTML przeglądarki. Zniekształcony HTML łamie się inaczej w IE niż w innych przeglądarkach.get
funkcję, która zwraca natywny element DOM. (Wiem, że ten temat jest stary, ale dodam go w celach informacyjnych ;-))[dom element].appendChild($('<html>')[0]);
Tworzenie nowych elementów DOM jest podstawową cechą tej
jQuery()
metody, patrz:źródło
$('<a>')
jest nie do przeszukiwania!Robię tak:
źródło
ponieważ
jQuery1.8
użycie$.parseHTML()
do tworzenia elementów jest lepszym wyborem.istnieją dwie korzyści:
1. jeśli używasz starego sposobu, który może być podobny
$(string)
, jQuery zbada ciąg znaków, aby upewnić się, że chcesz wybrać znacznik HTML lub utworzyć nowy element. Używając tego$.parseHTML()
, mówisz jQuery, że chcesz utworzyć nowy element, więc wydajność może być nieco lepsza.2. znacznie ważniejsze jest to, że możesz cierpieć z powodu ataku krzyżowego ( więcej informacji ), jeśli używasz starego sposobu. jeśli masz coś takiego:
zły facet może się
<script src="xss-attach.js"></script>
do ciebie drażnić. na szczęście$.parseHTML()
uniknij tego zawstydzenia:Należy jednak zauważyć, że
a
jest to obiekt jQuery, podczas gdyb
element html:źródło
parseHTML
jest dobra dla html pochodzących ze źródeł zewnętrznych, ale że „ wszystkie ulepszenia zniknęły po zawinięciu wyników w nowy obiekt jQuery ”. Oznacza to, że jeśli chcesz na stałe utworzyć nowy element HTML zawinięty w jQuery,$("<div>stuff</div>")
styl nadal wygrywa.AKTUALIZACJA
Od najnowszych wersji jQuery następująca metoda nie przypisuje właściwości przekazywanych w drugim obiekcie
Poprzednia odpowiedź
Wydaje mi się, że używanie
document.createElement('div')
razem zjQuery
jest szybsze:źródło
Chociaż jest to bardzo stare pytanie, pomyślałem, że byłoby miło zaktualizować je o najnowsze informacje;
Od jQuery 1.8 dostępna jest funkcja jQuery.parseHTML (), która jest obecnie preferowanym sposobem tworzenia elementów. Ponadto istnieją pewne problemy z analizowaniem kodu HTML za pośrednictwem
$('(html code goes here)')
, na przykład na oficjalnej stronie jQuery w następujących uwagach do wydania :Aby odnieść się do rzeczywistego pytania, podany przykład można przetłumaczyć na:
co jest niestety mniej wygodne niż używanie samego
$()
, ale daje większą kontrolę, na przykład możesz wykluczyć tagi skryptu (pozostawi skrypty wbudowane, jakonclick
chociaż):Oto punkt odniesienia od najwyższej odpowiedzi dostosowanej do nowej rzeczywistości:
JSbin Link
jQuery 1.9.1
Wygląda na to, że
parseHTML
jest znacznie bliżejcreateElement
niż$()
, ale wszystkie wzmocnienia zniknęły po zawinięciu wyników w nowym obiekcie jQueryźródło
źródło
Jest najkrótszym / najłatwiejszym sposobem utworzenia elementu DIV w jQuery.
źródło
Właśnie stworzyłem do tego małą wtyczkę jQuery: https://github.com/ern0/jquery.create
Podąża za twoją składnią:
Identyfikator węzła DOM można określić jako drugi parametr:
Czy to poważne? Nie. Ale ta składnia jest lepsza niż $ („<div> </div>”) i jest to bardzo dobry stosunek jakości do ceny.
Jestem nowym użytkownikiem jQuery, przełączam się z DOMAssistant, który ma podobną funkcję: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Moja wtyczka jest prostsza, myślę, że attrs i zawartość lepiej dodawać za pomocą metod łączenia:
Jest to także dobry przykład prostej wtyczki jQuery (setnej).
źródło
Wszystko jest całkiem proste! Oto kilka szybkich przykładów ...
źródło
Nie wspomniano w poprzednich odpowiedziach, więc dodaję przykładowy przykład tworzenia elementów z najnowszą wersją jQuery, również z dodatkowymi atrybutami, takimi jak zawartość, klasa lub wywołanie zwrotne po kliknięciu:
źródło
jQuery po wyjęciu z pudełka nie ma odpowiednika createElement. W rzeczywistości większość pracy jQuery odbywa się wewnętrznie przy użyciu innerHTML zamiast czystej manipulacji DOM. Jak wspomniano powyżej Adam, w ten sposób można osiągnąć podobne wyniki.
Dostępne są również wtyczki, które wykorzystują DOM przez innerHTML, takie jak appendDOM , DOMEC i FlyDOM, żeby wymienić tylko kilka. Pod względem wydajności natywna jquery jest nadal najbardziej wydajna (głównie dlatego, że używa innerHTML)
źródło