javascript - 选择两个元素之间的某些元素 [jQuery]

标签 javascript jquery

我想知道是否可以选择某些元素,在两点之间爬行 DOM。

下面是树的示例。我的愿望是选择具有 data-tagname 属性的所有 labels,从 input 开始,到 .parent 结束。然后的想法是将其设置为输入的名称,即 name="one_two_third_four"。

我可以通过显式向上遍历到相关元素来对特定 DOM 树执行此操作。例如:

$('input').each(function(){
    let label = 
        $(this).parent().parent()
               .parent().parent()
               .parent().parent()
               .prev('[data-tagname]')
               .attr('data-tagname')
          + '_' 
          + $(this).parent().parent()
               .parent().parent()
               .prev('[data-tagname]')
               .attr('data-tagname')
          + '_' 
          + $(this).parent().parent()
               .prev('[data-tagname]')
               .attr('data-tagname')
          + '_' 
          + $(this).prev('[data-tagname]')
                   .attr('data-tagname');
    $(this).attr('name', label);
    // 
    $(this).attr('placeholder', label);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li class="stop-here">
    <label data-tagname="one">1</label>
    <ul><li>
      <label data-tagname="two">2</label>
      <ul><li>
        <label data-tagname="three">3</label>
        <ul><li>
          <label data-tagname="four">4</label>
          <input type="text" id="startHere"/>
        </li></ul>
      </li></ul>
    </li></ul>
  </li>
</ul>

这种方法冗长且不灵活。由于结构并不总是相同(某些元素嵌套 5 次,其他元素嵌套 2 次),因此它不能解决一般情况。

TL;DR

我正在寻找一种解决方案,从 A 点向上遍历 DOM 树,过滤掉好东西,然后在 B 点停止。也许我们从 A 到 B 并推送所有我们想要的元素选择了一个空数组?

最佳答案

您可以使用 .parentsUntil() 函数从每个 INPUT 向上遍历 DOM 到第一个 LI.parent:

$('input').each(function() {
    var $this = $(this);
    var name = $this
        .parentsUntil($this.closest('.stop-here').parent(), 'li')
        .map(
            function() { 
                return $(this).find('> label:first').attr('data-tagname');
            }
        )
        .toArray()
        .reverse()
        .join('_')
    ;
    
    $this.attr('name', name);
    $this.attr('placeholder', name);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li class="stop-here">
    <label data-tagname="one">1</label>
    <ul><li>
      <label data-tagname="two">2</label>
      <ul><li>
        <label data-tagname="three">3</label>
        <ul><li>
          <label data-tagname="four">4</label>
          <input type="text" id="startHere"/>
        </li></ul>
      </li></ul>
    </li></ul>
  </li>
</ul>

由于您想要包含 LI.stop-here,因此我们使用其父级作为 .parentsUntil() 的第一个参数。

然后我们使用 .map() 聚合所有 data-tagname 属性,将它们类型转换为数组,反转顺序,然后使用_ 作为分隔符。

最后,我们将每个 INPUT 的名称设置为该名称字符串。在您的示例中,这是“one_two_third_four”

关于javascript - 选择两个元素之间的某些元素 [jQuery],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46915331/

相关文章:

javascript - 有没有办法将JS数组转换为JSON或Android中的数组?

javascript - 让 Packery 网格元素在其上方具有不透明层以进行悬停

javascript - JQuery 星级评分插件和 Ajax 的问题

javascript - 需要平均值 PHP、Jquery、Ajax

javascript - 将字符串变量传递给方法时出错

javascript - 为 html 输入类型 : file 添加按钮到(浏览器)弹出菜单

javascript - 有可能在 JavaScript 中为 "overwrite a pointer"吗?

javascript - 使用ajax上传图片和表单提交

jquery - 特定尺寸和位置的实心球

php - jQuery 将动态元素 id/值传递到 PHP