//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
解决方法
… append()
修改DOM,而不是jQuery对象。和一个空的jQuery对象没有DOM! Tomalak had the right idea,虽然你可能不了解它。
我将对你可能已经知道的jQuery的三个观察,但是它们有助于理解这个答案的其余部分,因此可能有益于未来的读者:
>一个jQuery对象基本上是一组DOM元素。
>一些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是一个空集,没有要追加的元素,…什么也没有发生。步骤#1工作正常 – 但通过创建一个没有任何DOM元素的集合,你已经设置自己失败,当你尝试使用存在的方法修改DOM!参考观察#2 …来修改集合,你需要调用一个实际操作集合的方法。
$new = $new.add("<soMetag>");
现在我们好,对吧?每次通过循环都会创建一个新的jQuery对象,包括前面设置的一个新创建的元素。好…
…这将只是导致步骤4做一些奇怪的事情。参见html()
是我在观察#3中提到的那些方法之一 – 它只对集合中的第一个元素操作。因此,除了一个序列(“< soMetag>< soMetag>< soMetag> …”),你只需要获得在第一遍循环中创建的元素的HTML表示(“< soMetag& “)。除了...你甚至不会得到它,因为html()
创建一个元素的孩子的表示 – 所以你真正的最终将是“”…
这是一个很大的失望:你开始使用集合(步骤#1),然后尝试操作DOM(步骤#3),并通过尝试从一个DOM元素拉取数据完成(didn’ t存在)(并且如果它存在,则不具有任何数据)(步骤#4)。
The solution you finally came up with不是可怕的 – 你基本上选择添加一个根元素到开始的集合,并完全操作这个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());