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.
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.
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.
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();
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 .
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?
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;}}
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.
Respuestas:
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
innerHTML
se establece en la cadena de HTML que ha pasado. Luego, jQuery transferirá cada uno de los nodos producidos (es decir, xchildNodes
) a un fragmento de documento recién creado, que luego almacenará en caché para la próxima vez. Luego devolverá los fragmentoschildNodes
como 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>
ajQuery()
, 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í .
innerHTML
generalmente 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 comoelement.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:
También hay cuestiones de legibilidad y mantenimiento a tener en cuenta.
Esta:
... es mucho más difícil de mantener que esto:
fuente
101
tendrá 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.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):
Dos envoltorios jQuery (por ejemplo):
Tienes algunos casos de uso diferentes. Si desea reemplazar el contenido,
.html
es una gran llamada ya que es el equivalente deinnerHTML = "..."
. Sin embargo, si solo desea agregar contenido, el$()
conjunto de envoltorio adicional no es necesario.Solo use dos envoltorios si necesita manipular los agregados
div
más adelante. Incluso en ese caso, es posible que solo necesite usar uno:fuente
si
.add
quiere decir.append
, entonces el resultado es el mismo si#myDiv
está vacío.¿Es el rendimiento el mismo? No lo se.
.html(x)
termina haciendo lo mismo que.empty().append(x)
fuente
Bueno,
.html()
utiliza el.innerHTML
que es más rápido que la creación de DOM .fuente
Puede obtener el segundo método para lograr el mismo efecto:
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:
fuente
px
no es necesario tener en cuenta):$('<div />', { width: myWidth }).appendTo("#myDiv");
.html()
reemplazará todo..append()
solo se agregará al final.fuente
Aparte de las respuestas dadas, en el caso de que tenga algo como esto:
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:
fuente
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.
.html
terminará agregando solo el último objeto al elemento primario, mientras.append
que agregará todos los objetos de la lista como elementos secundarios del elemento primario.fuente