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.
Author: John Slegers, 2008-11-06

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!

Http://jsben.ch/#/ARUtz

 1216
Author: nickf,
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.

 125
Author: Adam Bellaire,
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:

 65
Author: abernier,
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>​]
 39
Author: Brian,
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');
 38
Author: kami,
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');
 35
Author: Om Shankar,
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:

Jsbin Link

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

 27
Author: siergiej,
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
 11
Author: Shimon Doodkin,
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.

 7
Author: AcidicChip,
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 );
 5
Author: Randy,
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ż $("
") i jest to bardzo dobry stosunek jakości do ceny.

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).

 5
Author: ern0,
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?

 0
Author: LukeAskew,
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)

 -1
Author: James Hughes,
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