¿Cómo crear un objeto jQuery vacío, no nulo, listo para agregar?

7 minutos de lectura

avatar de usuario
Tony_Henrich

Quiero agregar algo de html a un objeto jQuery no nulo vacío solo en el bucle, pero no funciona a menos que cree un objeto y agregue una etiqueta html durante la creación. ¿Cómo puedo crear un objeto jQuery vacío y poder agregarle html más adelante?

//var $new = $().add("");  //can't use this object in the loop
//var $new = $([]);        //can't use this object in the loop
//var $new = $();        //can't use this object in the loop
//var $new = $("#nonexistingelement"); //can't use this object in the loop
var $new = $().add("<tr>");  //works but I don't want to add any html at this point. 

$.each(.....)
  {
    $new.append("<sometag>");

});

alert($new.html());  //should display some html

Suma:
http://jsfiddle.net/vfPNT/

  • Hay un montón de “no puedo” allí, y no mucho “esto es precisamente lo que vi”.

    – Carreras de ligereza en órbita

    08/04/2011 a las 17:13


  • también relacionado: stackoverflow.com/questions/897331/…. La respuesta parece ser $([]) en versiones anteriores de jQuery, y $() en los más nuevos. No pareces explicar por qué esto no es lo suficientemente bueno para ti.

    – Carreras de ligereza en órbita

    08/04/2011 a las 17:14

  • ¡No es un duplicado! Verifique el ejemplo de jsfiddle y observe que $([]) o $() ambos muestran nulo en la alerta. Quiero un objeto vacío no nulo. Revisa mi publicación antes de votar rápidamente para cerrar. Ya mencioné $([]) y $() en la publicación.

    – Tony_Henrich

    08/04/2011 a las 17:22


  • @Tony_Henrich: En tu violín, nunca creaste $new.

    – Carreras de ligereza en órbita

    08/04/2011 a las 17:23

  • @Tomalak: Estaba probando cada $nuevo. Lo actualicé. Descomente cada $nuevo y vea cómo se comporta cada $nuevo. Ninguno funciona como yo quiero.

    – Tony_Henrich

    08/04/2011 a las 17:26

avatar de usuario
shog9

Su problema aquí es que no hay objetos jQuery “nulos” que no se pueden agregar y “vacíos” que se pueden agregar. Ya ha identificado varias formas de crear uno vacío y, aunque puede haber más, no importa: lo que está tratando de hacer simplemente no hará lo que espera, no importa. cómo empiezas porque…

append() modifica el DOM, no el objeto jQuery. Y un objeto jQuery vacío no tiene DOM! Tomalak tuvo la idea correcta, aunque es posible que no la hayas entendido.

Voy a hacer tres observaciones sobre jQuery que probablemente ya conozca, pero que son útiles para comprender el resto de esta respuesta y, por lo tanto, pueden beneficiar a futuros lectores:

  1. Un objeto jQuery es fundamentalmente un establecer de elementos DOM.
  2. Algunos métodos jQuery operan en el conjunto y otros operan en los nodos en el conjunto.
  3. Algunos métodos jQuery operan solo en (o recuperan información solo de) el primero nodo añadido al conjunto.

Con estas tres observaciones en mente, consideremos su ejemplo:

// 1. create an empty set somehow (doesn't matter how)
var $new = $();

// 2. iterate over something
$.each( ..., function( ... )
{
  // 3. construct a DOM fragment from HTML, and append it
  $new.append("<sometag>"); 
});

// 4. try to display HTML corresponding to the jQuery object
alert($new.html());  

En este ejemplo, el paso 3 no hará nada útil porque el propósito de append() es tomar cualquier elemento DOM que se le dé y agregarlo como elementos secundarios a cada elemento DOM en el conjunto. Ya que $new es un vacío conjunto, no hay elementos a los que anexar, y… no pasa nada. El paso n.º 1 está funcionando bien, pero al crear un conjunto sin ningún elemento DOM, ¡se está preparando para fallar cuando intente usar métodos que existen para modificar el DOM! Observación de referencia n.º 2… para modificar el conjunto, debe llamar a un método que realmente opera En el set.

Bien, digamos que usamos el modificación del conjunto método add() en cambio:

  $new = $new.add("<sometag>");

Ahora estamos bien, ¿verdad? Cada paso a través del ciclo creará un nuevo objeto jQuery que consiste en el conjunto anterior + un elemento recién creado. Bien…

…esto solo hará que el paso #4 haga algo extraño. Ver, html() es uno de esos métodos que mencioné en la Observación #3 – opera solo en el primer elemento en el conjunto Así que en lugar de una secuencia ("<sometag><sometag><sometag>...") solo obtendrá una representación HTML del elemento creado en el primer paso por el ciclo ("<sometag>"). Excepto… Ni siquiera vas a conseguir queporque html() crea una representación del elemento niños entonces que eres De Verdad va a terminar con es ""

Todo esto fue simplemente una gran decepción: comenzó a trabajar con el conjunto (Paso n.° 1), luego trató de operar en el DOM (Paso n.° 3) y terminó tratando de extraer datos de una Elemento DOM (que no existía) (y no habría tenido ningún dato si existiera) (Paso #4).

La solución que finalmente se le ocurrió no es terrible: esencialmente está optando por agregar una elemento raíz al conjunto que comienza, y opere completamente en este fragmento DOM hasta que termine de agregar nuevos elementos y esté listo para operar en ellos. Lo ha omitido de su ejemplo revisado, pero html() también funcionaría, ya que simplemente volcaría el contenido de su elemento raíz.

Pero para completar, les daré un ejemplo final que funciona en el establecercomenzando con un objeto jQuery vacío:

var $new = $();
$.each( [1, 2, 3, 4], function(i, v)
{
  $new = $new.add("<div>");
});

alert($new.length == 4); // true

// alerts: <div></div><div></div><div></div><div></div>
alert($("<div>").append($new).html()); 

  • Creo que la pregunta es incorrecta porque establece todo tipo de soluciones problemáticas en lugar de centrarse en la pregunta/problema real. Creo que la respuesta elegida también es incorrecta de diferentes maneras. ¡Creo que esta respuesta es realmente genial! Está explicando por qué no funciona y cuál puede ser la solución correcta. Terminé en esta página y encontré lo que estaba buscando en tu respuesta. ¡Gracias!

    – 7ochem

    2 de septiembre de 2014 a las 10:28


  • Esta no es una respuesta a la pregunta, el autor solicitó un objeto vacío para appending, no addEn g.

    usuario1180790

    17 de septiembre de 2017 a las 4:54

  • Porque append() no opera en el objeto jQuery, @Benio, opera en los elementos contenidos en el objeto jQuery. Por definición, un objeto jQuery vacío no puede append()… Lea la respuesta anterior sobre por qué y cómo hacer lo que pretende el autor de la pregunta.

    – Shog9

    17 de septiembre de 2017 a las 5:24

  • @ Shog9 Mientras explicabas por qué no es posible, dando add código relacionado, Justin Geeslin en realidad proporcionó la respuesta correcta para appending, presentando un Fragmento de documentocuyo uso común es ensamblando un subárbol DOM dentro de élcomo dice api docs.

    usuario1180790

    17 de septiembre de 2017 a las 5:51

  • Sí, puedes usar con éxito append() siempre que primero agregue algún otro nodo al objeto jQuery, @Benio. Mientras el objeto no sea verdaderamente vacíohará algo.

    – Shog9

    19 de septiembre de 2017 a las 0:05

Los fragmentos de documentos son perfectos para esto; crea un objeto vacío listo para agregar. 🙂

$(document.createDocumentFragment())

  • $(”).add($el) o $().add($el) no funcionó, pero $(document.createDocumentFragment()) funcionó bien 💪🏼

    – Vilio Paulauskas

    23 de mayo de 2018 a las 13:02

tu objeto $new es un selector vacío, por lo que append no tiene conjuntos a los que anexar.

add es necesario para agregar un nodo DOM, y luego se agrega a esos nodos DOM. No crea que puede evitar comenzar con un .add.

avatar de usuario
Tomás

Probé la solución anterior pero no funcionó para mí, siempre permaneció como un objeto jQuery vacío …

Si alguien está interesado, aquí está mi solución:

var jQueryElements = [],
    $new;

$.each( [1, 2, 3, 4], function(i, v){
  jQueryElements = jQueryElements.push($('<div>').get(0));
});

$new = $(jQueryElements);

No pude encontrar otra manera, así que comencé con el <tr>. La eliminación de la <tr> mientras mantenía el contenido no funcionó correctamente y es por eso que publiqué la pregunta. Entonces, en cambio, creé una nueva selección de jQuery seleccionando todos los <sometag>'s which were inside the <tr> y tiró $nuevo.

var $new = $().add("<tr>");  

$.each(.....)
  {
    $new.append("<sometag>");

});
$new.append("</tr>");
$newObject = $('sometagt', $new)
..... do more work using $newObject

si no quieres terminar con una etiqueta fea:

if(!$new){
$new.append("</sometag>");
} else {
var $new = $("</sometag>");

¿Ha sido útil esta solución?