JS:ボタンに機能付与 | アラサー未経験エンジニアの勉強ノート(予定)

アラサー未経験エンジニアの勉強ノート(予定)

2023年秋から未経験でエンジニア転職したアラサー。
コーディングができない(死ぬほど遅い)現状を打破するべく、業務の予習や学んだことをここにまとめる(予定)。

<今日の発見>

・object.closest('element');で対象の親要素が取得できる。

 →data-idは親要素だけに付ければOK

 

・new Date().toLocaleDateString("ja-JP", {year: "numeric",month: "2-digit", day: "2-digit"})

 →これで(yyyy/MM/dd)の日付が取れる。

参考URL:

 

 

--------------------------------------------------------------------

 

        <table>

            <tbody>

                <tr ID="tr1" data-id="1">

                    <td style="display:none;"><input name="ID" type="text" ID="ID1" value="1"></td>

                    <td><input name="date" type="text" ID="承認日1" class="承認日"></td>

                    <td><button type="button" class="承認Btn">承認</td>

                    <td><button type="button" class="選択Btn">選択</td>

                </tr>

                <tr ID="tr2" data-id="2">

                    <td style="display:none;"><input name="ID" type="text" ID="ID2" value="2"></td>

                    <td><input name="date" type="text" ID="承認日2" class="承認日"></td>

                    <td><button type="button" class="承認Btn">承認</td>

                    <td><button type="button" class="選択Btn">選択</td>

                </tr>

                <tr ID="tr3" data-id="3">

                    <td style="display:none;"><input name="ID" type="text" ID="ID3" value="3"></td>

                    <td><input name="date" type="text" ID="承認日3" class="承認日"></td>

                    <td><button type="button" class="承認Btn">承認</td>

                    <td><button type="button" class="選択Btn">選択</td>

                </tr>

            </tbody>

        </table>

 

--------------------------------

<script defer>

//process------------

// 0.対象を含むtrのタグに「data-id」を付与しておく。

// 1.付与する具体的な処理を記述する(関数作成)

// 2.対象となるボタンを全て取得し、foreachで1で作成した関数をセットする。

 

//step------------

// 1-1.付与する具体的な処理を記述する(関数作成)

// 選択ボタン処理:選択された行の背景色を変える処理

function click選択Btn(選択Btn) {

    選択Btn.addEventListener('click', () => {

        let id = 選択Btn.closest('tr').dataset.id;

 

        // 全ての行の背景色をリセットする

        for(let i = 1; i <= 3;i++){

            let row = document.getElementById('tr' + i);

            row.style.backgroundColor = '';

        }

 

        // 対象の行の背景色をセットする

        let selectedRow = document.getElementById('tr' + id);

        selectedRow.style.backgroundColor = 'lightBlue';

    });

}

 

// 1-2.付与する具体的な処理を記述する(関数作成)

// 承認ボタン処理

// 選択された行のIDを取得し、次の画面に遷移する処理

function click承認Btn(承認Btn) {

    承認Btn.addEventListener('click', () => {

        let 承認id = 承認Btn.closest('tr').dataset.id;

        let ID = document.getElementById('ID' + 承認id).getAttribute('value');

        location.href = 'pagenext.php/ID=' + ID;

    });

}

 

// 1-3.承認日発行・取消処理

// 選択されたセルの背景色を変え、押下された日を表示・取消する処理

function click承認日(approveDay) {

    approveDay.addEventListener('click', () => {

        let id = approveDay.closest('tr').dataset.id;

 

        // 対象の行の背景色をセットする

        let selected承認日ID = document.getElementById('承認日' + id);

        let selected承認日 = selected承認日ID.value;

 

        if(selected承認日 == ""){

            selected承認日ID.style.backgroundColor = 'red';

            selected承認日ID.value = new Date().toLocaleDateString("ja-JP", {year: "numeric",month: "2-digit", day: "2-digit"})

        }else{

            selected承認日ID.value = "";

            selected承認日ID.style.backgroundColor = 'yellow';

        }    

    });

}

 

//step------------

// 2.対象となるボタンを全て取得し、foreachで1で作成した関数をセットする。

const 選択Btns = document.querySelectorAll('.選択Btn');

選択Btns.forEach(選択Btn => {

    click選択Btn(選択Btn);

});

 

const 承認Btns = document.querySelectorAll('.承認Btn');

承認Btns.forEach(承認Btn => {

    click承認Btn(承認Btn);

});

 

const approveDays = document.querySelectorAll('.承認日');

approveDays.forEach(approveDay => {

    click承認日(approveDay);

});

 

</script>

 

<備考>

機能を付与するボタンの数が少ないなら、

JSで「foreach」で付与ではなく、タグにonclick属性で関数付与がシンプルかなと思った。

(今回は最大8行になる想定で、onclickでタグに直書きすると文字数増えちゃうので、foreachで処理する)

 

所要時間:4時間。

ふぁいと!