dokument jQuery.createElement equivalent?
Refaktoryzuję stary kod JavaScript i jest dużo 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 jest lepszy sposób, aby to zrobić za pomocą jQuery. Eksperymentowałem z:
var odv = $.create("div");
$.append(odv);
// And many more
Ale nie jestem pewien, czy to jest lepsze. 13 answers
Oto twój przykład w "jednej" linijce.
this.$OuterDiv = $('<div></div>')
.hide()
.append($('<table></table>')
.attr({ cellSpacing : 0 })
.addClass("text")
)
;
Update: pomyślałem, że zaktualizuję ten post, ponieważ wciąż jest spory ruch. W komentarzach poniżej jest trochę dyskusji na temat $("<div>")
vs $("<div></div>")
vs $(document.createElement('div'))
jako sposobu tworzenia nowych elementów, a który jest "najlepszy".
Zestawiłem mały benchmark , A oto mniej więcej wyniki powtórzenia powyższych opcji 100 000 razy:
JQuery 1.4, 1.5, 1.6
Chrome 11 Firefox 4 IE9
<div> 440ms 640ms 460ms
<div></div> 420ms 650ms 480ms
createElement 100ms 180ms 300ms
JQuery 1.3
Chrome 11
<div> 770ms
<div></div> 3800ms
createElement 100ms
JQuery 1.2
Chrome 11
<div> 3500ms
<div></div> 3500ms
createElement 100ms
Myślę, że to żadna niespodzianka, ale to najszybsza Metoda. Oczywiście, Zanim zaczniesz refaktoryzować całą bazę kodu, pamiętaj, że różnice, o których tu mówimy (we wszystkich poza archaicznymi wersjami jQuery) wynoszą około 3 milisekundy na tysiąc elementów.
Update 2
Aktualizacja dla jQuery 1.7.2 I put benchmark na JSBen.ch co jest prawdopodobnie trochę bardziej naukowe niż moje prymitywne benchmarki, plus może być teraz crowdsourced!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 15:36:28
Po prostu podanie kodu HTML elementów, które chcesz dodać do konstruktora jQuery $()
zwróci obiekt jQuery z nowo zbudowanego HTML, odpowiedni do dodania do DOM przy użyciu metody jQuery append()
.
Na przykład:
var t = $("<table cellspacing='0' class='text'></table>");
$.append(t);
Można następnie wypełnić tę tabelę programowo, jeśli chcesz.
Daje to możliwość określenia dowolnego kodu HTML, w tym nazw klas lub innych atrybutów, które mogą być bardziej zwięzłe niż użycie createElement
i następnie ustawianie atrybutów takich jak cellSpacing
i className
przez JS.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-14 23:28:33
Tworzenie nowych elementów DOM jest podstawową cechą metody jQuery()
, patrz:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 17:34:58
Od jQuery1.8
, używając $.parseHTML()
tworzenie elementów jest lepszym wyborem.
Istnieją dwie korzyści:
1.jeśli używasz starego sposobu, który może być czymś w rodzaju $(string)
, jQuery sprawdzi ciąg znaków, aby upewnić się, że chcesz wybrać znacznik html lub utworzyć nowy element. Używając $.parseHTML()
, mówisz jQuery, że chcesz jawnie utworzyć nowy element, więc wydajność może być nieco lepsza.
2.o wiele ważniejsze jest to, że możesz cierpieć na cross site attack (więcej informacji) Jeśli używasz starego sposobu. jeśli masz coś takiego:
var userInput = window.prompt("please enter selector");
$(userInput).hide();
Zły facet może wprowadzić <script src="xss-attach.js"></script>
, aby dokuczyć Ci. na szczęście, $.parseHTML()
unikaj tego wstydu dla ciebie:
var a = $('<div>')
// a is [<div></div>]
var b = $.parseHTML('<div>')
// b is [<div></div>]
$('<script src="xss-attach.js"></script>')
// jQuery returns [<script src="xss-attach.js"></script>]
$.parseHTML('<script src="xss-attach.js"></script>')
// jQuery returns []
Należy jednak zauważyć, że a
jest obiektem jQuery, podczas gdy {[10] } jest elementem html:
a.html('123')
// [<div>123</div>]
b.html('123')
// TypeError: Object [object HTMLDivElement] has no method 'html'
$(b).html('123')
// [<div>123</div>]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 03:01:28
Robię tak:
$('<div/>',{
text: 'Div text',
class: 'className'
}).appendTo('#parentDiv');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 17:49:01
UPDATE
Od najnowszych wersji jQuery następująca metoda nie przypisuje właściwości przekazywanych w drugim obiekcie
Poprzednia odpowiedź
Czuję, że używanie document.createElement('div')
razem z jQuery
jest szybsze:
$(document.createElement('div'), {
text: 'Div text',
'class': 'className'
}).appendTo('#parentDiv');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 23:48:10
Mimo że jest to bardzo stare pytanie, pomyślałem, że byłoby miło zaktualizować je o najnowsze informacje; [10]}
Od jQuery 1.8 istnieje jQuery.funkcja parseHTML () , która jest obecnie preferowanym sposobem tworzenia elementów. Ponadto, istnieją pewne problemy z parsowaniem HTML przez $('(html code goes here)')
, Przykład Oficjalna strona jQuery wspomina o następującym w jednej z ich uwag do wydania :
Swobodne parsowanie HTML: możesz ponownie mieć spacje wiodące lub newlines przed znacznikami w $(htmlString). Nadal zdecydowanie zalecamy, aby używasz $.parseHTML () podczas parsowania HTML uzyskanego z zewnętrznego źródeł, i może dokonywać dalszych zmian w parsowaniu HTML w przyszłość.
Aby odnieść się do faktycznego pytania, podanym przykładem można przetłumaczyć na:
this.$OuterDiv = $($.parseHTML('<div></div>'))
.hide()
.append($($.parseHTML('<table></table>'))
.attr({ cellSpacing : 0 })
.addClass("text")
)
;
Co jest niestety mniej wygodne niż używanie tylko $()
, ale daje większą kontrolę, na przykład możesz wykluczyć tagi skryptu (pozostawi Skrypty wbudowane, takie jak onclick
chociaż):
> $.parseHTML('<div onclick="a"></div><script></script>')
[<div onclick="a"></div>]
> $.parseHTML('<div onclick="a"></div><script></script>', document, true)
[<div onclick="a"></div>, <script></script>]
Również, oto benchmark z górnej odpowiedzi dostosowanej do nowej rzeczywistości:
JQuery 1.9.1
$.parseHTML: 88ms $($.parseHTML): 240ms <div></div>: 138ms <div>: 143ms createElement: 64ms
Wygląda na to, że parseHTML
jest znacznie bliżej createElement
niż $()
, ale po owinięciu wyników w nowy obiekt jQuery
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 18:07:51
var mydiv = $('<div />') // also works
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 17:03:38
var div = $('<div/>');
div.append('Hello World!');
Jest najkrótszym/najłatwiejszym sposobem tworzenia elementu DIV w jQuery.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-22 22:43:07
Wszystko jest całkiem proste! Oto kilka szybkich przykładów...
var $example = $( XMLDocRoot );
var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root
$element.attr({
id: '1',
hello: 'world'
});
var $example.find('parent > child').append( $element );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-14 16:30:46
Właśnie zrobiłem mały plugin jQuery do tego: https://github.com/ern0/jquery.create
Wynika z Twojej składni:
var myDiv = $.create("div");
Identyfikator węzła DOM może być podany jako drugi parametr:
var secondItem = $.create("div","item2");
Czy to coś poważnego? Nie. Ale ta składnia jest lepsza niż $("Jestem nowym użytkownikiem jQuery, przełączającym się z DOMAssistant, który ma podobną funkcję: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Mój plugin jest prostszy, myślę, że attrs i treść lepiej dodawać metodami łańcuchowymi:
$("#container").append( $.create("div").addClass("box").html("Hello, world!") );
Jest to również dobry przykład dla prostej wtyczki jQuery (100-tej).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 14:49:30
Wydaje się, że tworzenie elementów doprowadzi Cię tylko do tej pory. Po rozpoczęciu łączenia różnica w wydajności jest znikoma.
Http://jsperf.com/jquery-dom-node-creation
Czy coś przeoczyłem?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 23:59:14
JQuery po wyjęciu z pudełka nie ma odpowiednika createElement. W rzeczywistości większość pracy jQuery jest wykonywana wewnętrznie za pomocą innerHTML zamiast czystej manipulacji DOM. Jak Adam wspomniał powyżej, w ten sposób można osiągnąć podobne wyniki.
Dostępne są również wtyczki, które wykorzystują DOM nad innerHTML jak appendDOM, DOMEC i FlyDOM Aby wymienić tylko kilka. Wydajnosci natywny jquery jest nadal najbardziej wydajny (glownie ze wzgledu na używa innerHTML)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 12:35:57