2008-12-03 23 views
34

Czy istnieje sposób na "wstępne zbudowanie" fragmentu kodu HTML przed dodaniem go do DOM?JQuery: Zbuduj HTML w "pamięci" zamiast DOM

Na przykład:

$mysnippet.append("<h1>hello</h1>"); 
$mysnippet.append("<h1>world</h1>"); 
$("destination").append($mysnippet); 

gdzie $ mysnippet robi istnieje w DOM. Chciałbym dynamicznie zbudować kilka brył html, a następnie wstawić je na stronę w odpowiednich punktach później.

Odpowiedz

39

Tak prawie dokładnie jak to zrobić

Niektóre przedłużenie tego ...

$('<div>').attr('id', 'yourid').addClass('yourclass').append().append()... 

i wreszcie

.appendTo($("#parentid")); 
+3

mam stwierdzającej Funkcja .wrap() nie działa z elementami in-memory/out-of-dom. – user982671

0

Jasne, tylko budować je jako ciąg znaków:

$mysnippet = "<h1>hello</h1>"; 
$mysnippet = $mysnippet + "<h1>world</h1>"; 
$("destination").append($mysnippet); 
+2

Traktowanie DOM jako tekstu jest hacky (DOM nie jest ciągiem znaków, po prostu trwa jako jeden), niewiarygodne (zwiększa szansę na stworzenie czegoś niezrównoważonego) i niepotrzebne (mamy natywne metody i JQuery do tworzenia węzłów). – mikemaccana

+0

@mikemaccana Czytanie kodu tworzenia DOM jest bolesne w dupie, a kod tworzenia DOM jest wolniejszy niż podawanie go w postaci ciągu. Wybierz bitwę. –

58

Gdy mamy do czynienia z bardziej skomplikowanych węzłów (zwłaszcza te, które mocno zagnieżdżonych), jest to lepsze podejście do pisania węzeł w HTML i ustawić jego widoczność ukryte.

Następnie można użyć metody clone() JQuery do utworzenia kopii węzła i dostosowania jej zawartości do własnych potrzeb.

E.g. z tym HTML:

<div class="template-node" style="display:none;"> 
    <h2>Template Headline</h2> 
    <p class="summary">Summary goes here</p> 
    <a href="#" class="storylink">View full story</a> 
</div> 

to o wiele szybciej i zrozumiałe zrobić:

var $clone = $('.template-node').clone(); 
$clone.find('h2').text('My new headline'); 
$clone.find('p').text('My article summary'); 
$clone.find('a').attr('href','article_page.html'); 
$('#destination').append($clone); 

niż tworzyć cały węzeł w pamięci jak pokazano powyżej.

+7

zapomniałeś, że dodajesz klon, który wciąż jest ukryty ... $ ('# miejsce docelowe'). Append ($ clone.show()) naprawi to. – ajma

+0

Uważam, że pomaga to w podłączeniu wyświetlacza: brak; do szablonu css, a następnie usuwając klasę z klonu, wyświetla kod HTML po dodaniu. –

+0

Czy istnieje szczególny powód, dla którego nazwa zmiennej została rozpoczęta znakiem $? –

8

Stary wątek, ale natknąłem się na niego podczas wyszukiwania tego samego.

var memtag = $('<div />', { 
       'class' : 'yourclass', 
       'id'  : 'theId', 
       'data-aaa' : 'attributevalue', 
       html  : 'text between the div tags' 
}); 

memtag jest teraz w tagu html pamięci i mogą być wstawiane do DOM, jeśli chcesz. Jeśli zrobisz coś ze znacznikiem img, możesz "wczytać" obrazy do pamięci podręcznej do późniejszego wykorzystania.

0
var sample = 
    $('<div></div>') 
     .append(
      $('<div></div>') 
       .addClass('testing-attributes') 
       .text('testing')) 
     .html(); 

który tworzy:

<div class="testing-attributes">testing</div> 
0

Można prebuild go i również dołączyć zdarzenia, jak również dane atrybutów, wewnętrzną html, itp, itd

var eltProps = { 
    css: { 
     border: 1, 
     "background-color": "red", 
     padding: "5px" 
    }, 
    class: "bblock", 
    id: "bb_1", 
    html: "<span>jQuery</span>", 
    data: { 
     name: "normal-div", 
     role: "building-block" 
    }, 
    click: function() { 
     alert("I was clicked. My id is" + $(this).attr("id")); 
    } 
}; 

var elt = $("<div/>", eltProps); 

$("body").append(elt); 
Powiązane problemy