textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました
textarea や input フォームの change イベントは, 編集後にフォーカスを解除したときに発行されます. つまり編集中, 値を変更してもフォーカスが残っている限り change イベントは発行されません.
しかし, Web ツールをつくる際, 機能として編集中でもリアルタイムで内容を参照して使いたいって時が多々あります.
そんな時に使えるスクリプト『tm.form-observer.js』を作りました.
『tm.form-observer.js』 はフォームを監視するスクリプトです. textarea や input フォームを 監視するよう指定することでリアルタイムでチェンジイベントを発行することができます.
前回のエントリー『JavaScript Tips – dispatchEvent を使いこなそう!!』 で解説した dispatchEvent を活用してネイティブっぽく拡張しているので, もうすでに作ってある Web ツールなんかでも簡単に導入できるように作ってあります.
ぜひ使ってみてください.
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のアンカー部分(#以降の文字列)を監視するスクリプトを公開しようと思います.
[…] textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました […]
めもめも。
textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life TM Life!!(ティーエム ライフ) 「Tim… http://t.co/Bl8ccSE8
textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life http://t.co/LUHTrerx
そいや普通のことなのになかったな。より本物のリアルタイムバリデーションできるじゃん。でもうざいなw
javascript: textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life http://t.co/BnbNTyo9
“textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life” http://t.co/bpqNSXrm
[JavaScript] / “textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life” http://t.co/wnaNZUpP
[hatena antenna] textarea や input フォームの change イベントをリアルタイムで発行するようにする tm.form-observer.js を作りました | TM Life http://t.co/WAU1LsPA
マリオが降ってくるのってなんの意味があるんですかね?非常に目障りですし、マリオのせいで文字がかぶって見えないし、非常に読む気が失せる。http://t.co/pTKUIVQw
おお!!
そんな方法もあるんですね!!
“change イベント”