textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました

phiary に引っ越しました. 毎日プログラミングやWebに関する情報を発信しています! RSS 登録してたまに覗いたり, tweet やハテブして拡散してもらえると幸いです.

Pocket

textarea や input フォームの change イベントは, 編集後にフォーカスを解除したときに発行されます. つまり編集中, 値を変更してもフォーカスが残っている限り change イベントは発行されません.

しかし, Web ツールをつくる際, 機能として編集中でもリアルタイムで内容を参照して使いたいって時が多々あります.

そんな時に使えるスクリプト『tm.form-observer.js』を作りました.

『tm.form-observer.js』 はフォームを監視するスクリプトです. textarea や input フォームを 監視するよう指定することでリアルタイムでチェンジイベントを発行することができます.

前回のエントリー『JavaScript Tips – dispatchEvent を使いこなそう!!』 で解説した dispatchEvent を活用してネイティブっぽく拡張しているので, もうすでに作ってある Web ツールなんかでも簡単に導入できるように作ってあります.

ぜひ使ってみてください.

View Demo Download

About

デモプログラムは textarea に入力した文字列の長さをリアルタイムで表示するサンプルです.

上の textarea はフォーカスを解除したときにのみ長さが反映されますが, 下の textarea はリアルタイムで 文字列の長さが反映されているのがわかるかと思います.

Usage

『tm.form-observer.js』の使い方は2通りあります.

要素を指定して監視

tm.FormObserver.observe メソッドに監視した要素を渡して実行することで監視を開始することができます.

var ta = document.getElementById("ta");
tm.FormObserver.observe(ta);

class 指定で監視

要素のクラス名に tm-form-observer を指定し, tm.FormObserver.observeAll() メソッドを実行することで tm-form-observer をクラス名に指定した要素全てを監視状態にすることができます.

window.onload = function()
{
    tm.FormObserver.observeAll();
};

Code

サンプルのコード全体です.

sample00 – 要素指定で監視

<html>
    <head>
        <meta charset="UTF-8" />
        <title>tm.form-observer.js - 要素指定で監視</title>
        <style>
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                -o-box-sizing: border-box;
                box-sizing: border-box;
                font-family: "Meiryo", Arial, Helvetica, sans-serif;
                line-height: 1.5em;
            }
            
            body {
                font-size: 16px;
            }
        </style>
        <script src="tm.form-observer.js"></script>
        <script>
            window.onload = function()
            {
                // 通常のチェンジイベントを登録
                var t0 = document.getElementById("t0");
                var c0 = document.getElementById("c0");
                
                t0.addEventListener("change", function(e){
                    c0.innerHTML = t0.value.length;
                }, false);
                
                // 監視するようにした要素にチェンジイベントを登録
                var t1 = document.getElementById("t1");
                var c1 = document.getElementById("c1");
                
                tm.FormObserver.observe(t1);    // 要素指定で監視開始
                t1.addEventListener("change", function(){
                    c1.innerHTML = t1.value.length;
                }, false);
            };
        </script>
    </head>
    <body>
        <header>
            <h1>tm.form-observer.js - 要素指定で監視</h1>
            <p>
                tm.FormObserver.observe(監視したい要素)を実行することで監視状態にすることができます.
            </p>
        </header>
        <div>
            <section id="sample00">
                <h2>通常の change イベントの場合</h2>
                <p>
                    フォーカスを解除した際に文字数が反映されます.
                </p>
                <div>
                    <textarea id="t0"></textarea>
                    <p>文字数 : <span id="c0">0</span></p>
                </div>
            </section>
            <section id="sample01">
                <h2>observer に登録した要素の change イベントの場合</h2>
                <p>
                    編集中にリアルタイムで文字数が反映されます.
                </p>
                <div>
                    <textarea id="t1"></textarea>
                    <p>文字数 : <span id="c1">0</span></p>
                </div>
            </section>
        </div>
    </body>
</html>

sample01 – class 指定で監視

<html>
    <head>
        <meta charset="UTF-8" />
        <title>tm.form-observer.js - class 指定で監視</title>
        <style>
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                -o-box-sizing: border-box;
                box-sizing: border-box;
                font-family: "Meiryo", Arial, Helvetica, sans-serif;
                line-height: 1.5em;
            }
            
            body {
                font-size: 16px;
            }
        </style>
        <script src="tm.form-observer.js"></script>
        <script>
            window.onload = function()
            {
                // tm-form-observer クラスを指定しているすべての要素を監視
                tm.FormObserver.observeAll();
                
                
                // 通常のチェンジイベントを登録
                var t0 = document.getElementById("t0");
                var c0 = document.getElementById("c0");
                
                t0.addEventListener("change", function(e){
                    c0.innerHTML = t0.value.length;
                }, false);
                
                // 監視するようにした要素にチェンジイベントを登録
                var t1 = document.getElementById("t1");
                var c1 = document.getElementById("c1");
                
                t1.addEventListener("change", function(){
                    c1.innerHTML = t1.value.length;
                }, false);
            };
        </script>
    </head>
    <body>
        <header>
            <h1>tm.form-observer.js - class 指定で監視</h1>
            <p>
                tm-form-observer というクラスを要素に指定し, tm.FormObserver.observeAll メソッドを実行することで
                監視状態にすることができます.
            </p>
        </header>
        <div>
            <section id="sample00">
                <h2>通常の change イベントの場合</h2>
                <p>
                    フォーカスを解除した際に文字数が反映されます.
                </p>
                <div>
                    <textarea id="t0"></textarea>
                    <p>文字数 : <span id="c0">0</span></p>
                </div>
            </section>
            <section id="sample01">
                <h2>observer に登録した要素の change イベントの場合</h2>
                <p>
                    編集中にリアルタイムで文字数が反映されます.
                </p>
                <div>
                    <textarea id="t1" class="tm-form-observer"></textarea>
                    <p>文字数 : <span id="c1">0</span></p>
                </div>
            </section>
        </div>
    </body>
</html>

次回のエントリーでは urlのアンカー部分(#以降の文字列)を監視するスクリプトを公開しようと思います.

TRACK BACK URL

POST COMMENT

メールアドレスが公開されることはありません。

COMMENT