STOF DOOS

へっぽこエンジニアのちまちま奮闘記

【DAY003】jQueryでtable要素のtd項目を動的に追加する

やりたいこと

jQueryでtable要素のtd項目を動的に追加する

具体的には、 動的に増やしたtbody内に存在する、select内容によって表示するtd項目を動的に切り替えたい

html

<table id="test-contents">
-- (略) --
<tbody>
    <tr>
         <td>
             <select class="select-option">
                  <option value="1"></option>
                  <option value="2"></option>
             </select>
        </td>
        <td display:none>1を選んだら表示するよ</td>
        <td display:none>2を選んだら表示するよ</td>
        <td class="addrow">+</td>
    <tr>
</tbody>

addrow のscriptは割愛。

動作としては、「+」を押下することで、tbodyが下にcloneされる。

結果として↓になる。

<table id="test-contents">
-- (略) --
<tbody>
    <tr>
         <td>
             <select class="select-option">
                  <option value="1"></option>
                  <option value="2"></option>
             </select>
        </td>
        <td display:none>1を選んだら表示するよ</td>
        <td display:none>2を選んだら表示するよ</td>
        <td class="addrow">+</td>
    <tr>
</tbody>
<tbody>
    <tr>
         <td>
             <select class="select-option">
                  <option value="1"></option>
                  <option value="2"></option>
             </select>
        </td>
        <td display:none>1を選んだら表示するよ</td>
        <td display:none>2を選んだら表示するよ</td>
        <td class="addrow">+</td>
    <tr>
</tbody>

当初詰まったポイントは、class="select-option" をイベントのトリガーにしているため、上方のtbodyにしか結果が反映されない、というところ。

script (jQuery)

closestが全て解決してくれた
$('.select-option').change(function() {

    if($(this).closest('option:selected').val == "1") {
        $(this).closest('tr').children('td:eq(1)').show('slow');
        $(this).closest('tr').children('td:eq(2)').hide(1000);

    } else if ($(this).closest('option:selected').val == "2") {
        $(this).closest('tr').children('td:eq(2)').show('slow');
        $(this).closest('tr').children('td:eq(1)').hide(1000);        
    }
});

tbodyが追加される際に、data- 属性を追加しようとかごちゃごちゃ考えていたけれど、closest で直前の要素を拾ってくる方がはるかにスマートでした。

うろ覚えで書いているので、間違っている可能性もある。 明日確認します。

また、さらにスマートな手法がありましたら、ご教授いただければ幸いです!!!