Collections jQuery是否向空选择添加元素?

Collections jQuery是否向空选择添加元素?,collections,jquery,Collections,Jquery,为什么这样不行 var spans = $(); var elem = document.getElementById('someId'); spans.add(elem); 从空集合开始并向其中添加元素的正确方法是什么? 我想在ID集合中循环,找到页面上的元素,并将其添加到匹配的集合中。您真正想做的是使用jQuery充分发挥其潜力。您可以使用选择器立即抓取并创建集合。上面的三行变成一行: var spans = $('#someId'); 要向集合中添加更多ID,可以使用逗号分隔: var

为什么这样不行

var spans = $();
var elem = document.getElementById('someId');
spans.add(elem);
从空集合开始并向其中添加元素的正确方法是什么?
我想在ID集合中循环,找到页面上的元素,并将其添加到匹配的集合中。

您真正想做的是使用jQuery充分发挥其潜力。您可以使用选择器立即抓取并创建集合。上面的三行变成一行:

var spans = $('#someId');
要向集合中添加更多ID,可以使用逗号分隔:

var spans = $('#someId1, #someid2, #someid3');
试一试

var span=$(“”);
var elem=$(“#someId”).html();
span.append(elem).appendTo(“#someAnotherId”);

相反

可能有更好的方法来执行您正在尝试的操作,但是如果您只想创建一个空的jQuery对象,请使用以下方法:

var $foo = $([]);

编辑:我应该澄清一下-您的代码实际上应该可以工作,除非您使用的是较旧版本的jQuery,在这种情况下,
$()
将创建一个包含
文档
对象的集合。然而,在新版本中,这并没有什么问题。我上面粘贴的代码片段应该可以在jQuery的旧版本和新版本中使用。
编辑2:为了回答问题的这一部分:“我想在ID集合中循环,并在页面上找到元素并将其添加到匹配集”,以下代码可能很有用:

var ids = ['foo', 'bar', 'baz'],
    selector = $.map(ids, function(i, id) {
        return '#' + id;
    }).join(','),
    $collection = $(selector);
.add()
方法返回一个新的jQuery对象,因此需要覆盖旧的对象:

spans = spans.add( elem );
…或者,由于要添加DOM元素,因此可以使用
.push()
修改现有的jQuery对象


编辑:
.pushStack()
更改为
.push()
,但我不知道是否正式支持
.push()


您可以使用
.pushStack()
添加一个集合

spans = spans.pushStack( [elem] );


代码不起作用的原因是
add
不会更改集合,而是返回一个包含新元素的新jQuery对象。如果你愿意,你可以说
span=span.add(elem),但您所做的是不必要的:jQuery的美妙之处在于它使这种命令式编程变得不必要。看看helloandre的答案,找到一个更容易实现目标的方法

如果这有意义的话,就像下面这样:

var x = [1, 2, 3];
x.concat(4);
console.log(x); // [1, 2, 3] -- concat does not mutate the original array
引述:

给定一个表示一组DOM元素的jQuery对象,
.add()
方法通过这些元素和传递给该方法的元素的并集构造一个新的jQuery对象

因此,当您这样做时,它不会保存添加的元素,您必须显式地将元素分配给新创建的对象,即

var $elements = $('.elements');
$elements = $elements.add($('#anotherelement'));

我想我不明白你的要求。如果您有一个元素,并且希望将其添加到集合中,只需使用
.add()
方法,就像前面所示。让一些人困惑的是,这会返回一个新的jQuery对象,因此您可以这样做:

var spans = $();
var elem = document.getElementById('someId');
spans = spans.add(elem);
当然,像这样的东西会更短:

var spans = $();
spans = spans.add('#someId');
当然,您不必从空对象开始。您可以从以下内容开始:

var spans = $('#someId');

如果要查看从jQuery对象中选择的
推送
添加
项,也可以执行以下操作:

var $els = $(),
    $someEls = $(".some-els");

$els.push.apply($els, $someEls);

这只是另一种方法。

虽然这并不能直接回答“如何附加到现有jQuery选择”的问题,但我有一个解决这个特定用例的方法

您可以将一个DOM元素数组传递给jQuery,它将从中创建一个jQuery选择

var spansArray = [];
var elem = document.getElementById('someId');
spansArray.push(elem);
var spans = $(spansArray);

我想不出为什么您需要一次一个地将每个元素添加到jQuery选择中,而不是一次将所有元素都添加到jQuery选择中,因此这应该是您用例的“替代品”。从理论上讲,这也必须证明更有效,因为jQuery的
.add()
最终只是在幕后的某个数组上调用
.push()

公平地说,jQuery的“预期用途”可能比您认为的要广一些……jQuery 1.6.2代码中的注释说push()是“仅供内部使用”而且它不在jQuery文档中。使用
.add()
并将新的jQuery对象分配给变量
span
@jfriend00似乎更安全:是的,有一些类似的。如果支持它们就好了。我认为其中一个问题是jQuery喜欢保持DOM元素的唯一性(没有DUP)和(我认为)DOM顺序,而
。push()
不这样做,因为它只是直接向数组中添加了一些内容。jQuery代码经常执行一个
.push()
,然后执行一个
.unique()。我只需要重新分配原始变量。这是解决这一问题的关键。谢谢大家。只是想知道ppl什么时候开始在javascript中使用$?PHP中最烦人的部分是,为什么要在其他语言中使用它?@Srneczek他们在它前面加了一个“sigil”,以表明它是一个“jQuery selection”对象,而不是一个常规的js数组/对象。这里有一个可以解释更多的问题:@Eric oh我明白了,这确实是最好的做法,但变量前的任何符号对类型来说都是纯粹的邪恶取决于jQuery版本,要创建一个空的jQuery对象,您可能需要执行
$([])
而不是
$()
。实际上,这似乎是唯一一个解决问题的方法:不仅要将选定的元素添加到空的、分离的集合中,还要将新创建的元素添加到该集合中。我喜欢在创建长列表,然后将结果分离的集合附加到最终的dom元素时使用这种方法。我想知道为什么$els.push($Somels)失败了。谢谢-这是因为您正在将一个数组推到一个数组上。Apply拆分扩展的jQuery数组,并将每个单独的元素推送到该数组上。与
var arr-[]相同;arr.push.apply([1,2,3])
,真的。
add
还可以对底层数组重新排序,
var spans = $('#someId');
var $els = $(),
    $someEls = $(".some-els");

$els.push.apply($els, $someEls);
var spansArray = [];
var elem = document.getElementById('someId');
spansArray.push(elem);
var spans = $(spansArray);