Javascriptで禁則処理をする
2009/5/26 Javascriptを更新しました。(こちら)
=================================
ちょっとしたアプリを作るのも一通りの道具がいる。
数年前、Ajaxが流行ったときも、Mashupだのなんだのと作ってサイトを立ててみたりしたが、キチンと道具を用意しなかった。
いまどきは、いろいろ便利なツールがあるが(このブログでたくさん取り上げているYUIなどはそう)、こまごまとした地味なものは作っておいた方が楽な気がする。
ここのところ、バリデーションの仕掛けを作ってみたが、同じ入力系ということでJavascriptで禁則を行うコードを書いてみた。
やりたいことは簡単。
- 入力してはいけない文字列を他の文字に置換する
一種のコンバータと考えていいと思う。
初期画面のスクリーンショットは以下。
禁則する文字は
として(はてなに表示されないので、「まる1〜まる10」と書く)、これが入力されたら「■」に置き換える。
画面の動きは、
- 入力フィールドに入力を行う。
- 入力フィールドからフォーカスを外すと置換された文字が帰ってくる。
ようにした。
以下が、適当にサンプルを入力した画面。
コンバートを行うscriptはオブジェクトMyConverterにしてみた。
下の「?????????」となっている部分は、「まる1〜まる10」である。
/*! * MyConverter.js * * tetsuya_odaka (EzoGP) * * (C) 2009, EzoGP. * $Id: syracava-1.0-min.js 455 2009-04-08 08:54:14Z tetsuya_odaka $ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * クライアントサイドでのコンバートオブジェクト。 * * (クロージャーパターンで実装) * * */ var MyConverter = function() { this.illegalChars =/[����������〜]+/g; /** * 禁則処理を行うメソッド * * @param * _string; 検証対象。 * @return * _rArray; エラー配列(エラーなしのときは長さ0) */ this.convertIllegal = function(_str){ alert(_str.match(this.illegalChars)); // コンバート return _str.replace(this.illegalChars,'■'); }; /* 自身の参照値を返却 */ return this; };
上の画面のHTMLの全文を以下に示す。
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>MyConverter</TITLE> <style type="text/css"> input.ez_initguide { /* grey */ color:#808080; } </style> <!-- YUI2.7.0 --> <script type="text/javascript" src="../scripts/lib/yui/build/yahoo/yahoo-min.js"> </script> <script type="text/javascript" src="../scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js"> </script> <!-- MyConverter --> <script type="text/javascript" src="../scripts/MyConverter.js"> </script> <script type="text/javascript"> /* * コンバート検証 * (モジュールパターンで実装) */ convert = function() { var cnvObj; var Dom = YAHOO.util.Dom; var Event = YAHOO.util.Event; /** * Inputにフォーカスが当たったときのハンドラー */ var onFocusHdlr = function(_evt,_obj) { // 初期値(入力ガイド)の場合だけ、入力値を消す。 // Dom.getStyleColor()は // rgb(128,128,128); mozilla, chrome, // #808080; IE7 // と異なった戻り値となる。 // _objは,HTMLInputElement; _e = YAHOO.util.Event.getTarget(_evt) var _id = _e.id; var _resId = _id + '_res'; var _fColor=Dom.getStyle(_id, 'color'); if( _fColor == 'rgb(128, 128, 128)' || _fColor == '#808080'){ // for IE Dom.get(_id).value=""; } // 入力フィールドの色を白にする。 Dom.setStyle(_id, 'background-color', 'white'); // 入力フィールドの文字の色をグレーから黒に変える Dom.setStyle(_id, 'color', 'black'); // メッセージフィールドを消す Dom.get(_resId).innerHTML=""; }; /** * Inputからフォーカスが外れたときのハンドラー */ var onBlurHdlr = function(_evt,_obj){ _e = YAHOO.util.Event.getTarget(_evt) var _id = _e.id; var _resId = _id + '_res'; // 検証対象を取得. var _str = Dom.get(_id).value; var _ret = cnvObj.convertIllegal(_str); Dom.get(_resId).innerHTML = _ret; }; return { /** * 初期処理 */ init: function() { cnvObj = new MyConverter(); // HTMLInputElementの配列を取得する。 var _inObj = document.getElementsByTagName('input'); for(var i = 0; i < _inObj.length; i++){ // type=textに、focusとblurにイベントを仕込む if(_inObj[i].getAttribute('type') == 'text'){ Event.addFocusListener(_inObj[i].id, onFocusHdlr, _inObj[i]); Event.addBlurListener(_inObj[i].id, onBlurHdlr, _inObj[i]); } } } // initの終わり }; }(); </script> </HEAD> <BODY onload="convert.init()"> <h3> クライアントサイドでのコンバート確認用 </h3> <form method="post" action='#'> 入力; <input id="text1" class="ez_initguide" type="text" size=50 value="入力してください." /> <div id="text1_res"></div> </form> <br> </body> </HTML>