如何创build一个空的,非空的jQuery对象准备好追加?

我想附加一些HTML到一个空的非空的jQuery对象只在循环中,但它不工作,除非我创build一个对象,并在创build过程中添加一个HTML标记。 我怎样才能创build一个空的jQuery对象,并能够稍后添加HTML?

//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 

增加: http : //jsfiddle.net/vfPNT /

你的问题在于,没有“空”的jQuery对象不能被追加到“空”的可能。 你已经确定了创build一个空的方法的几种方法,虽然可能有更多的方法,这并不重要 – 你试图做的只是不会做你期望的,不pipe你如何开始,因为…

append()修改DOM,而不是jQuery对象。 而一个空的jQuery对象没有DOM ! 托马拉克有正确的想法 ,虽然你可能还没有明白。

我将对您可能已经意识到的jQuery做三个观察,但是这对于理解这个答案的其余部分很有帮助,因此可能会使未来的读者受益:

  1. 一个jQuery对象基本上是一 DOM元素。
  2. 一些jQuery方法在集合上运行,一些jQuery方法在集合中的节点上运行。
  3. 一些jQuery方法仅对添加到集合中的第一个节点进行操作(或仅从中检索信息)。

考虑到这三点意见,我们来考虑一下你的例子:

 // 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()); 

在这个例子中,第3步将无法做任何有用的事情,因为append()的目的是为了获取它给出的任何DOM元素,并将它们作为子元素附加到集合中的每个DOM元素。 由于$new是一个集,所以没有要追加的元素,而且什么也没有发生。 第一步工作正常 – 但是通过创build一个没有任何DOM元素的集合,当你尝试使用存在的方法修改DOM时,你已经设置失败了! 参考观察#2 …来修改集合,您需要调用实际在集合上运行的方法。

好的,我们假设我们使用set修饰方法add()来代替:

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

现在我们很好,对吧? 循环中的每个循环都会创build一个新的jQuery对象,它由前一集+新创build的元素组成。 好…

这只会导致第四步做一些奇怪的事情。 看, html()是我在观察#3中提到的那些方法之一 – 它只对集合中的第一个元素进行操作。 因此,而不是一个序列( "<sometag><sometag><sometag>..." ),您只能获得在第一遍循环中创build的元素的HTML表示( "<sometag>" )。 除了…你甚至不会得到这个 ,因为html()创build了一个元素的元素的表示 – 所以你真正要结束的是""

这只是一个很大的失望:你开始使用集合(步骤#1),然后尝试操作DOM(步骤#3),并完成试图从一个 DOM元素(没有“ (如果存在,则不会有任何数据)(步骤#4)。

你最终想出的解决scheme并不可怕 – 你基本上select在开始的时候添加一个根元素,并且完全操作这个DOM片段,直到你完成添加新元素并准备好对它们进行操作。 你已经从修改的例子中省略了它,但是html()也可以工作,因为它只是简单地转储你的根元素的内容。

但是为了完整起见,我会给你一个最终的例子,从一个空的jQuery对象开始,

 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()); 

文件碎片是完美的, 创build一个空的对象准备添加。 🙂

 $(document.createDocumentFragment()) 

你的对象$new是一个空的select器,所以append没有要追加的集合。

add是需要添加一个DOM节点,然后你追加到这些DOM节点。 不要以为你可以避免以.add

我testet上述解决scheme,但它不适合我,它始终保持为空的jQuery对象…

如果有人有兴趣,这里是我的解决scheme:

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

我无法find另一种方式,所以我开始使用<tr> 。 删除<tr>同时保持内容不正常,这就是为什么我发布了这个问题。 因此,我通过select<sometag>'s which were inside the <tr>所有<sometag>'s which were inside the <tr>来创build新的jQueryselect,并抛弃了$ new。

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