2008-12-03 12 views
34

¿Hay alguna manera de "precompilar" un fragmento de HTML antes de agregarlo al DOM?JQuery: compila HTML en "memoria" en lugar de DOM

Por ejemplo:

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

donde $ mysnippet no lo existe en el DOM. Me gustaría construir dinámicamente algunos trozos de html y luego insertarlos en la página en los puntos apropiados más adelante.

Respuesta

39

Sí casi exactamente la forma en que lo ha hecho

Algunos extensión de esta ...

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

y finalmente

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

estoy encontrando que .wrap() no funciona con elementos in-memory/out-of-dom. – user982671

0

Claro, sólo construirlos como una cadena:

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

Tratar el DOM como texto es hacky (el DOM no es una cadena, solo persiste), no confiable (aumenta la posibilidad de crear algo desequilibrado) e innecesario (tenemos métodos nativos y JQuery para hacer nodos). – mikemaccana

+0

@mikemaccana Leer el código de creación de DOM es un fastidio y el código de creación DOM también es más lento que solo darle una cadena. Escoge tus batallas. –

58

Cuando se trata de nodos más complejos (especialmente los muy anidados), que es un mejor enfoque para escribir el nodo en HTML y establecer su visibilidad oculto.

Puede utilizar el método clone() de JQuery para hacer una copia del nodo y adaptar su contenido a sus necesidades.

E.g. con este código 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> 

es mucho más rápido y comprensible para hacer:

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

que crear todo el nodo de memoria como se muestra arriba.

+7

has olvidado que estás agregando el clon que aún está oculto .. $ ('# destination'). Append ($ clone.show()) lo arreglará. – ajma

+0

Me parece útil adjuntar la pantalla: ninguno; a la clase css de plantilla, y luego al eliminar la clase del clon, muestra el html cuando se agrega. –

+0

¿Hay alguna razón en particular por la que haya comenzado su nombre de variable con un signo $? –

8

Hilo viejo pero me encontré con él mientras buscaba lo mismo.

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

memtag es ahora una etiqueta HTML en la memoria, y se puede insertar en el DOM si lo desea. Si lo hace con una etiqueta img, puede "precargar" imágenes en la memoria caché para usarlas posteriormente.

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

que crea:

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

Puede prefabricados y también adjunte eventos, así como los atributos de datos, HTML interno, etc, etc.

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); 
Cuestiones relacionadas