技術資料

contenteditableで作るインライン編集システムとデータ送信の仕組み

2024.12.03

contenteditable属性を使ってHTML内のテキストを編集できるようにして、フォームのように扱い、変更があったらサーバーサイドで処理する、という流れを考えてみたいと思います。

画面のイメージは以下のような感じ。タイトルを一覧画面で直接編集できるようにしてみましょう。

タイトル カテゴリ 作成日
冷蔵庫にWi-Fi?IoT時代の家電事情 ガジェット 2024-11-28
ねこがボタンを押すとどうなるか検証してみた 実験 2024-11-26
古代ローマの税制を見習うべき理由 歴史 2024-11-25
「10秒でできる健康法」は本当に10秒か? 健康 2024-11-24
無人島でフレームワーク選ぶなら何? 技術雑談 2024-11-23

HTML側 - data属性で情報を付与する

HTML側では、contenteditable属性をつける要素に、data属性で情報を付与しておきます。

<table>
    <tr>
        <th>タイトル</th>
        <th>カテゴリ</th>
        <th>作成日</th>
    </tr><tr>
        <td><span contenteditable="true" class="article-title-editable trigger-posteditdata"
        data-posturl="https://mydomain/script/update_title/5">冷蔵庫にWi-Fi?IoT時代の家電事情</span></td>
        <td>ガジェット</td>
        <td>2024-11-28</td>
    </tr><tr>
        <td><span contenteditable="true" class="article-title-editable trigger-posteditdata"
        data-posturl="https://mydomain/script/update_title/4">ねこがボタンを押すとどうなるか検証してみた</span></td>
        <td>実験</td>
        <td>2024-11-26</td>
    </tr><tr>
        <td><span contenteditable="true" class="article-title-editable trigger-posteditdata"
        data-posturl="https://mydomain/script/update_title/3">古代ローマの税制を見習うべき理由</span></td>
        <td>歴史</td>
        <td>2024-11-25</td>
    </tr><tr>
        <td><span contenteditable="true" class="article-title-editable trigger-posteditdata"
        data-posturl="https://mydomain/script/update_title/2">「10秒でできる健康法」は本当に10秒か?</span></td>
        <td>健康</td>
        <td>2024-11-24</td>
    </tr><tr>
        <td><span contenteditable="true" class="article-title-editable trigger-posteditdata"
        data-posturl="https://mydomain/script/update_title/1">無人島でフレームワーク選ぶなら何?</span></td>
        <td>技術雑談</td>
        <td>2024-11-23</td>
    </tr>
</table>

data-posturlに、タイトルが変更された時に送信するサーバー側プログラムへのURLを指定しておきます。
今回の例だと、update_title という処理に各記事のID番号を付与してURLとして指定しています。

また、各タイトルを囲む span 要素には共通のクラス名を指定しておきます(今回の例では trigger-posteditdata というクラス名)。

ついでに、 article-title-editable というクラス名を付与しておいて、CSSの after疑似要素を使って後ろにペンの絵文字でもつけておくと、ユーザーが一目でこの欄が編集可能だとわかって良いかもしれません。

.article-title-editable:after{
    content: " \1F589";
}

編集後のテキストを取得して値を付与、送信

値が変更された時に、サーバーに値を送信するJavaScript側の処理は以下のような感じ(今回はjQueryを使っています)。

編集前の状態を保持しておき、カーソルが外れた時に値が変更されたかチェックする処理や、Enterキー押下で改行がされたくないので、Enterでフォーカスが外れる処理も入れてあります。

var posteditdata_value = '';
// フォーカスされた時に、変更前のデータを保持しておく
$(".trigger-posteditdata").focus(function(){
    posteditdata_value = $(this).text();
});
// Enterキー押下でフォーカスを外す
$(".trigger-posteditdata").on('keydown', function(e){
    if(e.key==='Enter' || e.keyCode===13){
        $(this).blur();
        return false;
    }
});
// フォーカスが外れた時の処理
$(".trigger-posteditdata").blur(function(){
    let edited_value = $(this).text();
    // データが変更されている時だけAjaxでデータ送信
    if(posteditdata_value != edited_value){
        let post_url = $(this).data('posturl');
        post_url += '/' + $(this).val();
        let edited_object = $(this);
        $.ajax({
            url: post_url,
            type: 'POST',
            dataType: 'html',
            data: {edited_name:edited_value},
            timeout: 5000,
        })
        .done(function(data) {
            // 成功時の処理
            console.log(data);
        })
        .fail(function(jqXHR, textStatus) {
            // 失敗時の処理
            $(edited_object).text(posteditdata_value); // 値を一度元に戻しておく
            console.log(textStatus);
            alert('Error: posteditdata '+posteditdata_value);
        });
    }
});

上記のスクリプトで、以下のURLに対してPOSTされることになります。

  • https://mydomain/script/update_title/[article_id]

以下のnameとvalueが送信されます。

name:edited_name
value:[変更後のタイトル]

サーバーサイドでは、このURLで受け取った値を元に、データを更新すればOK。

処理が複雑にはなりますが、頑張ればNotionぽいリッチテキストエディタなんかも作れますね。

datalistとJavaScriptで作るタグ入力フォームの実装ガイド

2024.11.17

ブログやアプリケーションで便利な「タグ入力フォーム」。この記事では、datalist要素を利用して、既存タグの選択と新規タグの追加を同時に実現するUIの作成方法をご紹介します。さらに、JavaScriptとCSSを活用して、複数選択対応やタグ削除機能、Enterキーでのタグ追加機能も実装。タグ入力フォームを効率的かつユーザーフレンドリーにカスタマイズする方法を詳しく解説します。

CSS HTML JavaScript jQuery

ダッシュボードのパフォーマンス改善:Ajaxとiframeの実践例

2024.12.11

サーバーサイドですべてを処理してから画面を出力するのではなく、データを分割して効率的に表示する手法をご紹介。Ajaxとiframe、それぞれの特徴や実装例をわかりやすく解説します。

HTML JavaScript jQuery

セレクトボックスでデータ更新を実現する仕組みと実装例

2024.11.29

「チェックボックスを使ったデータ更新の仕組み」に続く記事として、今回はセレクトボックスを活用したデータ更新の方法をご紹介します。複数の選択肢から値を選び、それをサーバー側に送信して更新する仕組みを、実装例とともに解説します。

HTML JavaScript jQuery

チェックボックスでデータ更新を実現する仕組みと実装例

2024.11.27

一覧画面のチェックボックスを用いて、データの状態を即時に更新する仕組みを実装する方法を解説します。HTMLの構造設計からJavaScriptの連携処理、サーバーサイドでの対応まで、説明しています。

HTML JavaScript jQuery

阿部辰也へのお仕事の依頼・お問い合わせ

お名前 *必須
会社名
メールアドレス *必須
電話番号
URL
お問い合わせのきっかけ
お問い合わせの内容 *必須
個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP