如何创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做三个观察,但是这对于理解这个答案的其余部分很有帮助,因此可能会使未来的读者受益:
- 一个jQuery对象基本上是一组 DOM元素。
- 一些jQuery方法在集合上运行,一些jQuery方法在集合中的节点上运行。
- 一些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