【问题标题】:Can I use .find() and .filter() at the same time?我可以同时使用 .find() 和 .filter() 吗?
【发布时间】:2014-08-01 15:13:20
【问题描述】:

我有一个包含以下 HTML 的 jQuery 对象。看起来像这样。

var myObject = $('<div><a href="#">Link A</a></div><a href="#">Link B</a>.');

我想像这样使用 .each() 修改其中的所有 &lt;a&gt; 标签:

myObject.find('a').each(function () {
    $(this).text( "Modified Link Text" );
});

我希望最终结果是链接 A 和链接 B 修改了它们的文本。不幸的是,如果我理解正确, .find() 只会查看顶级元素的后代。链接 A 嵌套在 &lt;div&gt; 标记中,因此可以正常工作。但是链接 B 不是,因此被跳过了。

我是否可以同时定位链接 A 和链接 B 而无需使用 .find() 和 .filter() 重复我的代码?

这是我制作的代码笔:http://codepen.io/jimmykup/pen/DKgJn?editors=101

【问题讨论】:

  • 你看过.addBack()吗? (api.jquery.com/addback)
  • 不能同时使用,但是您可以一个接一个地使用它们和/或一起使用。
  • 另外,您可能对此感兴趣:stackoverflow.com/questions/2828019/…
  • @CaseyFalk .addBack('a') 立即生效。谢谢你。其他人建议将其包装在标签中,然后使用 .find()。我想知道一个是否比另一个更有效。

标签: jquery


【解决方案1】:

这里有 3 条建议。你可以

A) 创建一个 DOM 节点并在其中找到您的元素:

var myObject = $('<div><a href="#">Link A</a></div><a href="#">Link B</a>.');

$('<div>').append(myObject).find('a').each(function () {
    $(this).text( "Modified Link Text" );
});

B) 将addBack() 与选择器一起使用:

myObject.find('a').addBack('a').each(function () {
    $(this).text( "Modified Link Text" );
});

C) 直接用.add()添加过滤后的元素

myObject.find('a').add(myObject.filter('a')).each(function () {
    $(this).text( "Modified Link Text" );
});

注意:如果你只改变文本,循环是没有用的。

【讨论】:

  • 我能够在不使用 .filter('a') 的情况下让选项 B 工作。我只是将选择器放在 .addBack('a') 中。另一方面,如果我只是更改文本,为什么你说循环是无用的?我的最终目标实际上是关于更改所有锚标签中的属性。但我很好奇你为什么这么说。
  • @jimmykup - 大多数 jQuery 方法,比如text,都会自行迭代,所以你真的不需要额外的循环,它只是开销,当然除非你在做其他事情在循环中
  • @jimmykup:关于您的效率评论,这里有一个带有 Karl 选项的 JSPerf:jsperf.com/adding-a-previous-element-to-a-jquery-set(随意使用/编辑它@Karl)。要点:addBack 对我来说是最快的(稍微)。
  • @CaseyFalk 感谢 jsPerf!至于我,add() 方法是最快的,但差别很小。这就像半千个操作差异。你甚至不会注意到它。
  • 有道理;我会假设addBack 无论如何都会在某个时候调用add,哈哈。可能只是我的浏览器打嗝什么的......
【解决方案2】:

执行此操作的通常方法是将其包装在一个额外的元素中,然后只需使用find,因为它无论如何都排除了父元素

$('<div />').append(myObject).find('a').text( "Modified Link Text" );

【讨论】:

  • 稍后我将输出生成的 HTML。在这一点上,我想要/需要把它从那个包装器中拿回来。你会说这样做更有效,还是完全跳过包装器并使用人们建议的 .addBack() 。
  • @jimmykup $('.selector').append(myObject); 会将其从包装中取出。
  • ^ 确实,您已经有了对没有包装器的元素的引用,但我想这取决于您真正在做什么,我一直使用这两种方法
【解决方案3】:

您可以将addBack 与这样的过滤器一起使用:

myObject.find('a').addBack('a').each(...)

这是我用来执行此操作的 jQuery 的 findAndSelf 扩展(因为我经常使用这种模式):

jQuery.fn.findAndSelf = function(selector){
   return this.find(selector).addBack(selector);
};

您的代码将如下所示:

myObject.findAndSelf('a').each(function () {
    $(this).text("Modified Link Text");
});

【讨论】:

    【解决方案4】:

    像这样将所有字符串放在一个父 div 中:

    var myObject = $('<div><div><a href="#">Link A</a></div><a href="#">Link B</a>.</div>');
    

    【讨论】:

    • "我可以同时使用 .find() 和 .filter() 吗?" - 这不能回答OP的问题,伙计。 :)
    猜你喜欢
    • 2011-07-21
    • 2015-05-19
    • 2019-05-21
    • 2021-09-05
    • 2014-04-08
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多