【问题标题】:Different between parents() and closest parent()父母()和最近的父母()之间的区别
【发布时间】:2016-01-21 01:36:45
【问题描述】:

我不太明白区别,在依赖关系树中只有一个my_class类的情况下,在:

$(this).parent().closest('.my_class').attr('id');

$(this).parents('.my_class').attr('id')

真的有区别吗?

编辑:没有这个没有重复,因为这里我以依赖树中只有一个 my_class 为例。我知道当 parents() 返回匹配元素的列表时 parent() 只返回一个元素,并且如果它与过滤器匹配,则最接近的 () 可以返回“this”。

HTML 示例:

<div class="agenda_relative">
    <div class="agenda_day" data-date="<?php echo $year."-".$m."-".$d; ?>">
            <div class="agenda_day_nr"><?php echo $d; ?></div>      
               <ul class="agenda_hour">
                    <?php foreach ($date->hours as $h): ?>
                        <li><?php echo $h; ?><p class='agenda_hour_input' data-hour="<?php echo $h; ?>" contenteditable="true"></p>

关于我想获取议程日期 div 的数据(“日期”)上的事件模糊

我有可行的解决方案,但我想知道上述两种方法之间是否有任何区别

【问题讨论】:

标签: jquery


【解决方案1】:

真的有区别吗?

不在您获得的 id 值中,不。

虽然他们得到相同的结果,但他们做的事情却不同:

  • $(this).parent().closest(".my_class") 构建三个 jQuery 对象,其中最后一个对象中最多包含一个元素。

  • $(this).parents(".my_class") 构建两个 jQuery 对象,其中最后一个可能包含多个元素,这些元素根据它们与this 的接近程度排列(第一个条目是最接近的)。当然,您已经说过在您的场景中只能存在一个.my_class,因此在您的特定情况中,您最多也只能获得一个元素。但在一般情况下,即使有嵌套的my_class 元素,你仍然会得到正确的id

在遍历的次数上也有所不同:在第二种情况下,即使找到了父级,jQuery 仍然会继续遍历父级,寻找更多的父级(因为虽然你知道没有任何父级)更多要查找,jQuery 没有,所以它继续查找)。在第一种情况下,它会在找到的第一个中停止。

【讨论】:

  • "在依赖树只有一个my_class类的情况下"
  • 这很重要,因为我已经知道你写了什么,我特别想知道在这种情况下,parents() 和 parent().closest(xxxx) 之间是否存在真正的区别
  • 非常感谢您的编辑,这正是我需要知道的 :)
  • @VincentTeyssier:np。我刚刚也添加了一个关于遍历的注释,我打算包含,但不知何故最初没有。
  • @VincentTeyssier:在那种情况下,如果你知道this 永远不会有my_class(我不知道你是否知道,但如果你知道的话),可能只有$(this).closest(".my_class") 会最好。保存创建一个额外的 jQuery 对象。
【解决方案2】:

假设.my_class 也不在当前元素上,你实际上只是想要:

$(this).closest('.my_class').attr('id');

另外两个抓取不同数量的匹配元素(父元素仅获取直接的 parent 元素,parents 获取所有祖先元素,closest 在第一个匹配时停止)。

【讨论】:

  • 所以理论上在这种情况下, parents() 和 parent().closest(xxxx) 之间完全没有区别?
  • 第二种效率更高。 parents() 可能会返回多个匹配项。 parent().closest() 最多匹配一个并提前停止,因此效率更高。
  • 确实如此。即使它没有返回多个匹配项,它仍然必须去寻找它们(因为 it 不知道它不会找到它们)。
  • @T.J.Crowder。我的意思是在attr 电话之前的倍数,因为它们被浪费了,但我看到你已经在你的回答中涵盖了它:)
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多