javascript - with - jquery create element




jQuery document.createElement equivalente? (9)

¡Todo es bastante sencillo! Heres un par de ejemplos rápidos ...

var $example = $( XMLDocRoot );
var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root

$element.attr({
id: '1',
hello: 'world'
});
var $example.find('parent > child').append( $element );

Estoy refactorizando un código JavaScript antiguo y hay mucha manipulación de DOM en marcha.

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 hacerlo utilizando jQuery. He estado experimentando con:

var odv = $.create("div");
$.append(odv);
// And many more

Pero no estoy seguro de si esto es mejor.


Acabo de hacer un pequeño complemento de jQuery para eso: https://github.com/ern0/jquery.create

Sigue tu sintaxis:

var myDiv = $.create("div");

El ID del nodo DOM se puede especificar como segundo parámetro:

var secondItem = $.create("div","item2");

¿Es serio? No. Pero esta sintaxis es mejor que $ ("<div> </div>") , y es un valor muy bueno para ese dinero.

Soy un nuevo usuario de jQuery, cambiando 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 mediante métodos de encadenamiento:

$("#container").append( $.create("div").addClass("box").html("Hello, world!") );

Además, es un buen ejemplo para un simple jQuery-plugin (el número 100).


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 de 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 publicación :

Análisis HTML relajado: una vez más puede tener espacios iniciales o nuevas líneas antes de las etiquetas en $ (htmlString). Aún le recomendamos encarecidamente que use $ .parseHTML () cuando analice el HTML obtenido de fuentes externas, y puede que esté realizando cambios adicionales en el análisis de HTML en el futuro.

Para relacionarse con la pregunta actual, siempre que el ejemplo pueda ser traducido a:

this.$OuterDiv = $($.parseHTML('<div></div>'))
    .hide()
    .append($($.parseHTML('<table></table>'))
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

lo que desafortunadamente es menos conveniente que usar solo $() , pero le da más control, por ejemplo, puede elegir excluir etiquetas de secuencia de comandos (dejará secuencias de comandos en línea como onclick ):

> $.parseHTML('<div onclick="a"></div><script></script>')
[<div onclick=​"a">​</div>​]

> $.parseHTML('<div onclick="a"></div><script></script>', document, true)
[<div onclick=​"a">​</div>​, <script>​</script>​]

Además, aquí hay un punto de referencia de la respuesta superior ajustado a la nueva realidad:

JSbin Link

jQuery 1.9.1

  $.parseHTML:    88ms
  $($.parseHTML): 240ms
  <div></div>:    138ms
  <div>:          143ms
  createElement:  64ms

Parece que parseHTML está mucho más cerca de createElement que $() , pero todo el impulso desaparece después de envolver los resultados en un nuevo objeto jQuery



Parece que la creación de elementos solo te llevará hasta ahora. Una vez que comienza el encadenamiento, la diferencia de rendimiento es despreciable.

http://jsperf.com/jquery-dom-node-creation

¿Me estoy perdiendo de algo?


Simplemente suministrando el HTML de los elementos que desea agregar a un constructor jQuery $() devolverá un objeto jQuery a partir del HTML creado recientemente, adecuado para ser agregado al DOM usando el método append() jQuery.

Por ejemplo:

var t = $("<table cellspacing='0' class='text'></table>");
$.append(t);

A continuación, puede rellenar esta tabla mediante programación, si lo desea.

Esto le da la capacidad de especificar cualquier HTML arbitrario que le guste, incluidos los nombres de clase u otros atributos, que puede encontrar más conciso que usar createElement y luego configurar atributos como cellSpacing y className través de JS.


jQuery fuera de la caja no tiene el equivalente a un elemento de creación. De hecho, la mayoría del trabajo de jQuery se realiza internamente utilizando innerHTML sobre la manipulación de DOM pura. Como Adam mencionó anteriormente, así es como puedes 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 eficaz (principalmente porque utiliza innerHTML)


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 con jQuery es más rápido:

$(document.createElement('div'), {
    text: 'Div text',
    'class': 'className'
}).appendTo('#parentDiv');

var mydiv = $('<div />') // also works




dhtml