jQueryで要素を囲む方法を調べた際に出てくるのが「wrap」、「wrapInner」、「wrapAll」です。
今回はこの3種類のメソッドの使い方と、ちょっとした応用を1つ紹介します。

wrapについて

wrapを使うと指定したHTML要素で、対象の要素を1つずつ囲むことができます。

<p>ダミーテキスト1</p>
<p>ダミーテキスト2</p>
<p>ダミーテキスト3</p>

上記のようなHTMLに対して下記のように指定すると

$('p').wrap('<div></div>');

このような形に1つずつ囲む事が出来ます。

<div><p>ダミーテキスト1</p></div>
<div><p>ダミーテキスト2</p></div>
<div><p>ダミーテキスト3</p></div>

wrapInnerについて

wrapInnerを使うと対象の要素の中身を丸ごと囲む事が出来ます。

<p>ダミーテキスト1</p>
<p>ダミーテキスト2</p>
<p>ダミーテキスト3</p>

wrapInnerの場合は対象の中身をまとめて囲うためこのようになります。

$('p').wrapInner('<span></span>');
<p><span>ダミーテキスト1</span></p>
<p><span>ダミーテキスト2</span></p>
<p><span>ダミーテキスト3</span></p>

wrapAllについて

wrapAllを使うと対象に当てはまる要素を全て1つにまとめて囲むことができます。

<div class="textbox">
    <p>ダミーテキスト1</p>
    <p>ダミーテキスト2</p>
    <p>ダミーテキスト3</p>
</div>

上記のようなHTML構造の際に、wrapAllを使うとこのようになります。

$('.textbox p').wrapAll('<div class="inner"></div>');
<div class="textbox">
    <div class="inner">
        <p>ダミーテキスト1</p>
        <p>ダミーテキスト2</p>
        <p>ダミーテキスト3</p>
    </div>
</div>

wrapAllの注意点

<div class="textbox">
    <p>ダミーテキスト1</p>
    <p>ダミーテキスト2</p>
    <p>ダミーテキスト3</p>
</div>
<div class="textbox">
    <p>ダミーテキスト4</p>
</div>

上記のように、複数の同じ要素がある際にそのまま同じ処理を行うと、1つ目の要素の方に引っ張られ下記のような形になってしまいます。

<div class="textbox">
    <div class="inner">
        <p>ダミーテキスト1</p>
        <p>ダミーテキスト2</p>
        <p>ダミーテキスト3</p>
        <p>ダミーテキスト4</p>
    </div>
</div>

<div class="textbox">
</div>

今回やりたかった事

<ul class="list">
    <li>
        <div>除外したい</div>
        <p>ダミーテキスト1</p>
        <p>ダミーテキスト2</p>
        <p>ダミーテキスト3</p>
        <div>除外したい</div>
    </li>
    <li>
        <div>除外したい</div>
        <p>ダミーテキスト4</p>
        <p>ダミーテキスト5</p>
        <p>ダミーテキスト6</p>
        <div>除外したい</div>
    </li>
</ul>

上記のような時に、liの中のpタグのみをその場で別のタグで囲みたかったのですが、ここまでで説明した「wrap」、「wrapInner」、「wrapAll」をそのまま使うだけでは上手く対応出来なかったので下記のように対応した結果、目的の形に整形する事が出来ました。

var count = $('.list li').length;
for(let i = 0; i < count; i++){
    $('.list li').eq(i).children('*:not( div )').wrapAll('<div class="inner"></div>');
}
<ul class="list">
    <li>
        <div>除外したい</div>
        <div class="inner">
            <p>ダミーテキスト1</p>
            <p>ダミーテキスト2</p>
            <p>ダミーテキスト3</p>
        </div>
        <div>除外したい</div>
    </li>
    <li>
        <div>除外したい</div>
        <div class="inner">
            <p>ダミーテキスト4</p>
            <p>ダミーテキスト5</p>
            <p>ダミーテキスト6</p>
        </div>
        <div>除外したい</div>
    </li>
</ul>
コメントを残す
コメントを残す