【问题标题】:jQuery add elements to empty selection?jQuery将元素添加到空选择?
【发布时间】:2011-11-23 22:30:46
【问题描述】:

为什么这不起作用?

var spans = $();
var elem = document.getElementById('someId');
spans.add(elem);

从一个空集合开始并向其中添加元素的正确方法是什么? 我想遍历一组 id 并在页面上找到该元素并将其添加到匹配的集合中。

【问题讨论】:

标签: collections jquery


【解决方案1】:

您真正想要做的是充分利用 jQuery。您可以使用选择器立即抓取和创建集合。你上面的三行变成了一行:

var spans = $('#someId');

要向集合中添加更多 id,可以用逗号分隔它们:

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

【讨论】:

  • 公平地说,jQuery 的“预期目的”可能比你想象的要广泛...
【解决方案2】:

试试

var spans = $("<span />");
var elem = $("#someId").html();
spans.append(elem).appendTo('#someAnotherId');

改为

【讨论】:

    【解决方案3】:

    可能有更好的方法来做你正在尝试的事情,但如果你只想创建一个空的 jQuery 对象,请使用:

    var $foo = $([]);
    


    编辑:我应该澄清一下-您的代码实际上应该可以工作,除非您使用的是旧版本的jQuery,在这种情况下$() 将创建一个包含document 对象的集合。但是,在较新的版本中,这并没有错。我在上面粘贴的代码 sn-p 只是应该在旧版本和新版本的 jQuery 中工作的东西。
    编辑2:针对这部分问题:“我想遍历一个id集合并在页面上找到元素并将其添加到匹配的集合中”,下面的代码可能是有用:
    var ids = ['foo', 'bar', 'baz'],
        selector = $.map(ids, function(i, id) {
            return '#' + id;
        }).join(','),
        $collection = $(selector);
    

    【讨论】:

      【解决方案4】:

      .add() 方法返回一个新的 jQuery 对象,所以你需要覆盖旧的:

      spans = spans.add( elem );
      

      ...或者由于您正在添加 DOM 元素,您可以使用 .push() 修改现有的 jQuery 对象。

      spans.push( elem );
      

      编辑:.pushStack() 更改为.push(),虽然我不知道.push() 是否得到官方支持。


      您可以使用.pushStack() 添加收藏。

      spans = spans.pushStack( [elem] );
      

      spans = spans.pushStack( document.getElementsByTagName('div') );
      

      【讨论】:

      • jQuery 1.6.2 代码中的 cmets 说 push() 是“仅供内部使用”,它不在 jQuery 文档中。使用.add() 并将新的jQuery 对象分配给变量span 似乎更安全。
      • @jfriend00:是的,有一些这样的。如果他们得到支持会很好。
      • 我认为问题之一是 jQuery 喜欢保持 DOM 元素是唯一的(没有重复)和(我认为)在 DOM 顺序中,.push() 并没有直接这样做只是在数组中添加一些东西。 jQuery 代码经常执行 .push() 后跟 .unique() ,这会将事情恢复到他们喜欢的方式。
      • @jfriend00:有道理。
      【解决方案5】:

      您的代码不起作用的原因是因为add 没有更改集合,它返回一个包含新元素的新jQuery 对象。如果你愿意,你可以改成spans = spans.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
      

      【讨论】:

        【解决方案6】:

        引用jQuery website:

        给定一个表示一组 DOM 元素的 jQuery 对象,.add() 方法从这些元素和传递给方法的元素的联合构造一个新的 jQuery 对象。

        因此,当您执行.add() 时,它不会保存添加的元素,您必须将元素显式分配给新创建的对象,即

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

        【讨论】:

        • 所有答案都非常正确。我只需要重新分配原始变量。这是解决方案的关键。谢谢大家。
        • 只是想知道人们从什么时候开始在 JavaScript 中使用 $? PHP 中最烦人的部分,为什么要在其他语言中使用它?
        • @Srneczek 他们在它前面加上一个“sigil”,以表明它是一个“jQuery selection”对象,而不是一个常规的 js 数组/对象。这是一个解释更多的问题:stackoverflow.com/questions/846585/…
        • @Eric 哦,我明白了,这肯定是最佳实践,但变量之前的任何符号仍然是纯邪恶的类型
        【解决方案7】:

        我想我不明白你在问什么。如果你有一个元素并且你想将它添加到一个集合中,你只需使用.add() 方法,就像你已经展示的那样。让一些人感到困惑的是,这会返回一个新的 jQuery 对象,所以你会这样做:

        var spans = $();
        var elem = document.getElementById('someId');
        spans = spans.add(elem);
        

        当然,这样的东西会更短:

        var spans = $();
        spans = spans.add('#someId');
        

        当然,您不必从空对象开始。你可以从以下开始:

        var spans = $('#someId');
        

        【讨论】:

        • "让一些人感到困惑的是,这会返回一个新的 jQuery 对象"——在我看来,这是最好的答案。
        【解决方案8】:

        如果您要查找从 jQuery 对象中选择的 pushadd 项目,您也可以这样做:

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

        只是另一种方式。

        【讨论】:

        • 事实上,这似乎是唯一解决问题的方法:不仅将选定的元素,而且将新创建的元素添加到一个空的、分离的集合中。在创建长列表时我喜欢这种方法,然后将生成的分离集合附加到最终的 dom 元素。我想知道为什么只是 $els.push($someEls) 失败了。
        • 谢谢 - 这是因为你将一个数组推到一个数组上。 Apply 拆分扩展的 jQuery 数组并将每个单独的元素推送到它上面。和var arr - []; arr.push.apply([1,2,3]);一样,真的。
        • add 还可以重新排序底层数组,这是我无法拥有的。
        【解决方案9】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-17
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多