« UTF8対応のMeCabインストール | メイン | サーバの移動しました(2005/10/09) »

エンターキーの押下でフォームの送信を行わないようにする

エンターキーの押下でフォームの送信を行わないようにするJavaScript。
オライリーの「JavaScript & DHTML クックブック」に載ってたりするわけだが、

function BlockEnter(evt){
	evt = (evt) ? evt : event; 
	var charCode=(evt.charCode) ? evt.charCode : 
		((evt.which) ? evt.which : evt.keyCode);
	if ( Number(charCode) == 13 || Number(charCode) == 3) {
		return false;
	} else {
		return true;
	}
}

こういうコードを書いて、

<input type="text" name="search" onkeydown="return BlockEnter(event);">

というように紹介されている訳だが、いまいちSafariでうまく動かない。エンターキーを押した時点で送信されてしまう。
キーボードに関するイベントには、keyup、keydown、keypressの3つがあるので1つ1つ試したところ、onkeypressでIE、Firefox、Safari全てうまく動いた。

onkeydownをすべてのinput要素に追加して行くのは面倒なので以下のスクリプトを書き、

function attachBlockEnter(formid) {
	var elements = document.forms[formid].elements;
	for (var j=0; j < elements.length; j++) {
		var e = elements[j];	
		if (e.type == "text"){
			e.onkeypress=BlockEnter;
		}
	}
}

formを指定するだけで内部のテキスト入力要素全てに適用されるようにした。
使用例:

<form name="form1">
〜〜〜
<input type="text" name="search">
〜〜
</form>
<script>
attachBlockEnter('form1');
</script>


単純な検索フォームでは適用できないが、アンケート等多くの項目がある場合はいれておくとUIの改善になるのではないでしょうか。

ちなみに、これをprototype.jsで書き直すと、

var attachBlockEnter = Class.create();
attachBlockEnter.prototype = {
	initialize: function(fid) {
		this.fele=$(fid);
		Event.observe(this.fele,'keypress',this.BlockEnter.bindAsEventListener(this), false);
	},

	BlockEnter: function(event) {
    	if(event.keyCode == Event.KEY_RETURN){
    		Event.stop(event);
    		return;
    	}
	}
}

になると思うんだけど、Safariの場合、prototype.jsのEvent.observe functionでkeypressがkeydownに書き換えられてしまいうまく動かない。SafariのJavaScript実装のだめだめさを理解してきた今日この頃。Mac IEは言わずものがな。

トラックバック

この一覧は、次のエントリーを参照しています: エンターキーの押下でフォームの送信を行わないようにする:

» attachBlockEnter の紹介と修正 from Code-404
フォームの 1 行テキストフィールドにてエンターキーの押下でフォーム内容の送信を抑止する attachBlockEnter の prototype.js ... [詳しくはこちら]

» Return キーを押したときの挙動を修正 from SaaaCH UpdateInformer
なんか、こういう作業ってつまらん。けど、大事よね。と言い聞かせて修正。ここの記事が参考になりました。というか、そのまんまだけど。 こういう地味な作業よりも... [詳しくはこちら]

» エンターキーの押下でフォームの送信を行わないようにする : blog.nomadscafe.jp/MSM from 地図さえあれば〜My Sweet Map〜
エンターキーの押下でフォームの送信を行わないようにするJavaScript。オライリーの「JavaScript & DHTML クックブック」に載... [詳しくはこちら]

» Formのエンターキーで勝手にSubmitされてしまう場合の対応方法 from 我思う故に我あり
Formのエンターキーで勝手にSubmitされてしまう場合の対応方法Ajaxを多用したフォームで重宝するとおもう。たとえば郵便番号から住所を自動で入力する... [詳しくはこちら]