jquery .html () vs .append ()

248

Digamos que tengo un div vacío:

<div id='myDiv'></div>

Es esto:

$('#myDiv').html("<div id='mySecondDiv'></div>");

Lo mismo que:

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);
Argiropoulos Stavros
fuente
21
no, el segundo no tiene una identificación, por lo que no se generará el mismo texto.
Matt Ellen
.html es mucho más rápido después de ejecutarlo por primera vez. puede tardar un segundo más o menos cuando lo ejecutas por primera vez.
sukhjit dhot

Respuestas:

316

Cada vez que pasa una cadena de HTML a cualquiera de los métodos de jQuery, esto es lo que sucede:

Se crea un elemento temporal, llamémoslo x. x innerHTMLse establece en la cadena de HTML que ha pasado. Luego, jQuery transferirá cada uno de los nodos producidos (es decir, x childNodes) a un fragmento de documento recién creado, que luego almacenará en caché para la próxima vez. Luego devolverá los fragmentos childNodescomo una nueva colección DOM.

Tenga en cuenta que en realidad es mucho más complicado que eso, ya que jQuery hace un montón de comprobaciones entre navegadores y varias otras optimizaciones. Por ejemplo, si pasa solo <div></div>a jQuery(), jQuery tomará un atajo y simplemente lo hará document.createElement('div').

EDITAR : para ver la gran cantidad de controles que realiza jQuery, eche un vistazo aquí , aquí y aquí .


innerHTMLgeneralmente es el enfoque más rápido, aunque no dejes que eso gobierne lo que haces todo el tiempo. El enfoque de jQuery no es tan simple como element.innerHTML = ...: como mencioné, hay muchas comprobaciones y optimizaciones.


La técnica correcta depende en gran medida de la situación. Si desea crear una gran cantidad de elementos idénticos, lo último que desea hacer es crear un bucle masivo, creando un nuevo objeto jQuery en cada iteración. Por ejemplo, la forma más rápida de crear 100 divs con jQuery:

jQuery(Array(101).join('<div></div>'));

También hay cuestiones de legibilidad y mantenimiento a tener en cuenta.

Esta:

$('<div id="' + someID + '" class="foobar">' + content + '</div>');

... es mucho más difícil de mantener que esto:

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});
James
fuente
55
jQuery (Array (101) .join ('<div> </div>')); <- ¿por qué 101 en lugar de 100?
tacone
2
Solo quería agregar un punto de datos. Haciendo algunas pruebas de rendimiento en una aplicación que carga un lote grande (10K +) de <li> 's en un <ul> y vio un aumento en el tiempo de procesamiento (no carga) de ~ 12s -> .25s cambiando el .append ( giantListHTMLAsASingleString) a .html (giantListHTMLAsASingleString). Si ya está haciendo el truco de 'unirse' o creando una gran cadena html en su lista, definitivamente hay una diferencia en estos dos métodos.
omnisis
99
@tacone Porque el "pegamento" de unión se aplica entre los elementos de la matriz. 101tendrá 100 colas aplicada, exactamente como unirse a 3 elementos tendría 2 colas: EL-glue-EL-glue-EL. En el ejemplo de James, los elementos de la matriz están "vacíos", por lo que unir N elementos vacíos da como resultado colas N-1 consecutivas.
Fabrício Matté
55
Para aquellos interesados ​​en una referencia para la sintaxis jquery utilizada anteriormente y lo que está permitido, ver api.jquery.com/jquery/#jQuery-html-attributes .
Thaddeus Albers
1
Hay una gran diferencia en que pierde los datos que se adjuntaron a los doms.
Adrian Bartholomew
68

Ellos no son los mismos. El primero reemplaza el HTML sin crear otro objeto jQuery primero. El segundo crea un contenedor jQuery adicional para el segundo div, luego lo agrega al primero.

Un jQuery Wrapper (por ejemplo):

$("#myDiv").html('<div id="mySecondDiv"></div>');

$("#myDiv").append('<div id="mySecondDiv"></div>');

Dos envoltorios jQuery (por ejemplo):

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);

Tienes algunos casos de uso diferentes. Si desea reemplazar el contenido, .htmles una gran llamada ya que es el equivalente de innerHTML = "...". Sin embargo, si solo desea agregar contenido, el $()conjunto de envoltorio adicional no es necesario.

Solo use dos envoltorios si necesita manipular los agregados divmás adelante. Incluso en ese caso, es posible que solo necesite usar uno:

var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");
// other code here
mySecondDiv.hide();
Doug Neiner
fuente
¿Lo ves? La concatenación de cadenas ya dejó un error aquí (cita sin escape). ver mi publicación: P
kizzx2
20

si .addquiere decir .append, entonces el resultado es el mismo si #myDivestá vacío.

¿Es el rendimiento el mismo? No lo se.

.html(x) termina haciendo lo mismo que .empty().append(x)

mkoryak
fuente
Además, el primero obviamente tendría una identificación de mySecondDiv, mientras que el otro no tendría identificación. Y la sintaxis debería ser .html ("<div id = 'mySecondDiv'> </div>") usando comillas dobles para poder usar las comillas simples.
ryanulit
9

Bueno, .html()utiliza el .innerHTMLque es más rápido que la creación de DOM .

Luca Matteis
fuente
7

Puede obtener el segundo método para lograr el mismo efecto:

var mySecondDiv = $('<div></div>');
$(mySecondDiv).find('div').attr('id', 'mySecondDiv');
$('#myDiv').append(mySecondDiv);

Luca mencionó que html()solo inserta el HTML que resulta en un rendimiento más rápido.

Sin embargo, en algunas ocasiones, optaría por la segunda opción, considere:

// Clumsy string concat, error prone
$('#myDiv').html("<div style='width:'" + myWidth + "'px'>Lorem ipsum</div>");

// Isn't this a lot cleaner? (though longer)
var newDiv = $('<div></div>');
$(newDiv).find('div').css('width', myWidth);
$('#myDiv').append(newDiv);
kizzx2
fuente
55
Este es un código jQuery extremadamente ineficiente (y roto). Si desea evitar la concatenación, haga esto: (también pxno es necesario tener en cuenta):$('<div />', { width: myWidth }).appendTo("#myDiv");
Doug Neiner
3
¿Cómo es esto "no útil"? El cartel pedía la "diferencia" (la palabra clave es "vs"), así que le digo la diferencia. El código es detallado, pero yo no diría "ineficiente" solo porque no es un trazador de líneas. ¿No deberíamos ser detallados al explicar cosas a las personas?
kizzx2
3

.html() reemplazará todo.

.append() solo se agregará al final.

daCoda
fuente
2

Aparte de las respuestas dadas, en el caso de que tenga algo como esto:

<div id="test">
    <input type="file" name="file0" onchange="changed()">
</div>
<script type="text/javascript">
    var isAllowed = true;
    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = $('#test').html();
            tmpHTML += "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').html(tmpHTML);
            isAllowed = false;
        }
    }
</script>

lo que significa que desea agregar automáticamente una carga de archivo más si se cargaron archivos, el código mencionado no funcionará, porque después de cargar el archivo, se volverá a crear el primer elemento de carga de archivos y, por lo tanto, el archivo cargado se borrará de él . Debería usar .append () en su lugar:

    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').append(tmpHTML);
            isAllowed = false;
        }
    }
Arianbakh
fuente
0

Esto me ha pasado . Versión de jquery: 3.3. Si está recorriendo una lista de objetos y desea agregar cada objeto como elemento secundario de algún elemento dom primario, entonces .html y .append se comportarán de manera muy diferente. .htmlterminará agregando solo el último objeto al elemento primario, mientras .appendque agregará todos los objetos de la lista como elementos secundarios del elemento primario.

Binita Bharati
fuente