Estoy refactorizando algún código JavaScript antiguo y hay mucha manipulación 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);
Me gustaría saber si hay una mejor manera de hacer esto usando jQuery. He estado experimentando con:
var odv = $.create("div");
$.append(odv);
// And many more
Pero no estoy seguro de si esto es mejor.
Respuestas:
Aquí está su ejemplo en la línea "uno".
Actualización : pensé en actualizar esta publicación, ya que todavía recibe bastante tráfico. En los comentarios a continuación hay una discusión sobre
$("<div>")
vs$("<div></div>")
vs$(document.createElement('div'))
como una forma de crear nuevos elementos, y cuál es el "mejor".Creé un pequeño punto de referencia , y aquí están más o menos los resultados de repetir las opciones anteriores 100,000 veces:
jQuery 1.4, 1.5, 1.6
jQuery 1.3
jQuery 1.2
Creo que no es una gran sorpresa, pero
document.createElement
es el método más rápido. Por supuesto, antes de salir y comenzar a refactorizar toda su base de código, recuerde que las diferencias de las que estamos hablando aquí (en todas las versiones menos arcaicas de jQuery) equivalen a aproximadamente 3 milisegundos adicionales por mil elementos .Actualización 2
Se actualizó para jQuery 1.7.2 y puso el punto de referencia en el
JSBen.ch
que probablemente sea un poco más científico que mis puntos de referencia primitivos, ¡además ahora se puede hacer crowdsourcing!http://jsben.ch/#/ARUtz
fuente
$('div')
cual es visualmente muy similar, pero funcionalmente se separa.$(document.createElement('div'))
y debería ser la más rápida?Simplemente suministrando el HTML de los elementos que desea agregar a un constructor jQuery
$()
devolverá un objeto jQuery del HTML recién creado, adecuado para ser agregado al DOM usando elappend()
método de jQuery .Por ejemplo:
A continuación, puede rellenar esta tabla mediante programación, si lo desea.
Esto le da la capacidad de especificar cualquier HTML arbitrario que desee, incluidos los nombres de clase u otros atributos, que puede encontrar más conciso que usar
createElement
y luego establecer atributos comocellSpacing
y aclassName
través de JS.fuente
$(htmlStr)
se implementa comodocument.createElement("div").innerHTML = htmlStr
. En otras palabras, invoca el analizador HTML del navegador. El HTML con formato incorrecto se rompe de manera diferente en IE frente a otros navegadores.get
función que devuelve el elemento DOM nativo. (Sé que este tema es antiguo, pero lo agrego como referencia. ;-))[dom element].appendChild($('<html>')[0]);
Crear nuevos elementos DOM es una característica central del
jQuery()
método, consulte:fuente
$('<a>')
es ingoginable!Estoy haciendo asi:
fuente
desde entonces
jQuery1.8
, usar$.parseHTML()
para crear elementos es una mejor opción.Hay dos beneficios:
1.si usa la forma anterior, que puede ser algo así
$(string)
, jQuery examinará la cadena para asegurarse de que desea seleccionar una etiqueta html o crear un nuevo elemento. Al usar$.parseHTML()
, le dice a jQuery que desea crear un nuevo elemento explícitamente, por lo que el rendimiento puede ser un poco mejor.2.mucho más importante es que puede sufrir un ataque cruzado ( más información ) si usa la forma anterior. si tienes algo como:
un chico malo puede ingresar
<script src="xss-attach.js"></script>
para molestarte. Afortunadamente,$.parseHTML()
evita esta vergüenza para ti:Sin embargo, tenga en cuenta que
a
es un objeto jQuery mientras queb
es un elemento html:fuente
parseHTML
es bueno para html proveniente de fuentes externas, pero que " todo el impulso se ha ido después de envolver los resultados en un nuevo objeto jQuery ". Es decir, si desea codificar la creación de un nuevo elemento html envuelto en jQuery, el$("<div>stuff</div>")
estilo aún parece ganar.ACTUALIZAR
A partir de las últimas versiones de jQuery, el siguiente método no asigna propiedades pasadas en el segundo objeto
Respuesta anterior
Siento que usar
document.createElement('div')
junto conjQuery
es más rápido:fuente
Aunque esta es una pregunta muy antigua, pensé que sería bueno actualizarla con información reciente;
Desde jQuery 1.8 hay una función jQuery.parseHTML () que ahora es una forma preferida de crear elementos. Además, hay algunos problemas con el análisis HTML a través de
$('(html code goes here)')
, por ejemplo, el sitio web oficial de jQuery menciona lo siguiente en una de sus notas de lanzamiento :Para relacionarse con la pregunta real, el ejemplo proporcionado podría traducirse a:
que desafortunadamente es menos conveniente que usar solo
$()
, pero le da más control, por ejemplo, puede optar por excluir etiquetas de script (dejará scripts en línea comoonclick
):Además, aquí hay un punto de referencia de la respuesta superior ajustada a la nueva realidad:
Enlace JSbin
jQuery 1.9.1
Parece que
parseHTML
está mucho más cercacreateElement
que$()
, pero todo el impulso se ha ido después de envolver los resultados en un nuevo objeto jQueryfuente
fuente
Es la forma más corta / fácil de crear un elemento DIV en jQuery.
fuente
Acabo de hacer un pequeño complemento jQuery para eso: https://github.com/ern0/jquery.create
Sigue tu sintaxis:
La ID del nodo DOM se puede especificar como segundo parámetro:
¿Es serio? No. Pero esta sintaxis es mejor que $ ("<div> </div>") , y es un muy buen valor por ese dinero.
Soy un nuevo usuario de jQuery, cambio de DOMAssistant, que tiene una función similar: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Mi complemento es más simple, creo que es mejor agregar atributos y contenido encadenando métodos:
Además, es un buen ejemplo para un simple jQuery-plugin (el número 100).
fuente
¡Todo es bastante sencillo! Aquí hay un par de ejemplos rápidos ...
fuente
No se menciona en respuestas anteriores, por lo que estoy agregando ejemplos de trabajo sobre cómo crear elementos de elementos con la última jQuery, también con atributos adicionales como contenido, clase o devolución de llamada onclick:
fuente
jQuery listo para usar no tiene el equivalente de createElement. De hecho, la mayoría del trabajo de jQuery se realiza internamente mediante innerHTML sobre la manipulación de DOM puro. Como Adam mencionó anteriormente, así es como puede lograr resultados similares.
También hay complementos disponibles que hacen uso del DOM sobre innerHTML como appendDOM , DOMEC y FlyDOM solo por nombrar algunos. En cuanto al rendimiento, el jquery nativo sigue siendo el más eficiente (principalmente porque usa innerHTML)
fuente