首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将某些元素包装成相同的父元素?

如何将某些元素包装成相同的父元素?
EN

Stack Overflow用户
提问于 2017-05-21 15:32:33
回答 2查看 123关注 0票数 1

我有这样的标记:

代码语言:javascript
复制
<div id = "main-region">
  <div id = "section-1">
    <p>
      <span id = "index-1">elementA</span>
      <span id = "index-2">elementB</span>
      <span id = "index-3">elementC</span>
      <span id = "index-4">elementD</span>
      <span id = "index-5">elementE</span>
    </p>
  </div>
  <div id = "section-2">
    <p>
      <span id = "index-6">elementF</span>
      <span id = "index-7">elementG</span>
      <span id = "index-8">elementH</span>
      <span id = "index-9">elementI</span>
      <span id = "index-10">elementJ</span>
    </p>
  </div>
  <div id = "section-3">
    <p>
      <span id = "index-11">elementK</span>
      <span id = "index-12">elementL</span>
      <span id = "index-13">elementM</span>
      <span id = "index-14">elementN</span>
      <span id = "index-15">elementO</span>
    </p>
  </div>
</div>

我正在尝试开发一个函数,传递给与索引相对应的数字,将所有的跨度封装在一个span中的这些索引之间。假设我们将数字3和12传递给我们想要得到的函数:

代码语言:javascript
复制
<div id = "main-region">
  <div id = "section-1">
    <p>
      <span id = "index-1">elementA</span>
      <span id = "index-2">elementB</span>
      <span class = "wrapped">
        <span id = "index-3">elementC</span>
        <span id = "index-4">elementD</span>
        <span id = "index-5">elementE</span>
      </span>
    </p>
  </div>
  <div id = "section-2">
    <p>
      <span class = "wrapped">
        <span id = "index-6">elementF</span>
        <span id = "index-7">elementG</span>
        <span id = "index-8">elementH</span>
        <span id = "index-9">elementI</span>
        <span id = "index-10">elementJ</span>
      </span>
    </p>
  </div>
  <div id = "section-3">
    <p>
      <span class = "wrapped">
        <span id = "index-11">elementK</span>
        <span id = "index-12">elementL</span>
        <span id = "index-13">elementM</span>
      </span>
      <span id = "index-14">elementN</span>
      <span id = "index-15">elementO</span>
    </p>
  </div>
</div>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-21 16:33:34

从可以用于index()实例的所有跨范围的集合开始。

然后迭代每个父容器,并在其子容器上使用filter()构建要使用wrapAll()包装的组

代码语言:javascript
复制
function wrapSpans(start, end) {
  var $cont = $('.span-container'),
     //collection of all spans
    $spans = $cont.children();
  // loop all the containers and filter children to wrap
  $cont.each(function() {
    $(this).children('span').filter(function() {
      var idx = $spans.index(this); // index within all spans collection     
      return idx >= (start - 1) && idx <= end;
    }).wrapAll('<span class="wrapped">');
  });
}

wrapSpans(3, 12)
代码语言:javascript
复制
span {
  display: block
}

.wrapped {
  border: 1px solid green
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main-region">
  <div id="section-1">
    <p class="span-container">
      <span id="index-1">elementA</span>
      <span id="index-2">elementB</span>
      <span id="index-3">elementC</span>
      <span id="index-4">elementD</span>
      <span id="index-5">elementE</span>
    </p>
  </div>
  <div id="section-2">
    <p class="span-container">
      <span id="index-6">elementF</span>
      <span id="index-7">elementG</span>
      <span id="index-8">elementH</span>
      <span id="index-9">elementI</span>
      <span id="index-10">elementJ</span>
    </p>
  </div>
  <div id="section-3">
    <p class="span-container">
      <span id="index-11">elementK</span>
      <span id="index-12">elementL</span>
      <span id="index-13">elementM</span>
      <span id="index-14">elementN</span>
      <span id="index-15">elementO</span>
    </p>
  </div>
</div>

票数 4
EN

Stack Overflow用户

发布于 2017-05-21 16:32:20

使用attr选择器获取每个部分的所有部分,首先,如果先前包装或调用函数,则需要删除包装标记。

代码语言:javascript
复制
thisSection.find('.wrapped').contents().unwrap();

然后在这个部分中找到所有的跨度,使用每一个来检查每一个跨度。

var thisId = parseInt(value.id.replace('index-', ''));得到这个跨度的int id。

如果thisId ==启动?把这个跨度包起来。或者,如果thisId介于开始和开始之间,请将其包装,因为这是部分的开始(索引== 0)。

对于span的其余部分,检查它是开始/结束还是等于结束,使用.wrapped在appendTo范围内移动这个div。prev()将找到prev元素。

代码语言:javascript
复制
$(this).appendTo($(this).prev('.wrapped'));

代码语言:javascript
复制
function wrapper(start, end) {
  $('[id^=section]').each(function(index) {
    var thisSection = $(this);
    //remove wrapped tag if previously wrapped
    thisSection.find('.wrapped').contents().unwrap();

    thisSection.find('span').each(function(index, value) {
      var thisId = parseInt(value.id.replace('index-', ''));
      //if start index between start/end OR start == thisId [do wrap]
      if ((index == 0 && start < thisId && thisId <= end) ||
        start == thisId) {
        $(this).wrap('<span class="wrapped"></span>');
      } else if (start < thisId && thisId <= end) {
        $(this).appendTo($(this).prev('.wrapped'));
      }
    })
  })
}

$('#start, #end').on('change', function() {
  wrapper($('#start').val(), $('#end').val())
})

wrapper(3, 12);
代码语言:javascript
复制
.wrapped {
  background: red;
}

span {
  margin: 2px;
  padding: 0;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input id="start" value="3" />
<input id="end" value="12" />

<div id="main-region">
  <div id="section-1">
    <p>
      <span id="index-1">elementA</span>
      <span id="index-2">elementB</span>
      <span id="index-3">elementC</span>
      <span id="index-4">elementD</span>
      <span id="index-5">elementE</span>
    </p>
  </div>
  <div id="section-2">
    <p>
      <span id="index-6">elementF</span>
      <span id="index-7">elementG</span>
      <span id="index-8">elementH</span>
      <span id="index-9">elementI</span>
      <span id="index-10">elementJ</span>
    </p>
  </div>
  <div id="section-3">
    <p>
      <span id="index-11">elementK</span>
      <span id="index-12">elementL</span>
      <span id="index-13">elementM</span>
      <span id="index-14">elementN</span>
      <span id="index-15">elementO</span>
    </p>
  </div>
</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44098624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档