全角スペースのチェック



0   名前: ABDS : 2006/05/31(水) 13:29  ID:EnWNHqjc
はじめまして。ABDSという者です。
今、テキストボックス内でスペースが押された場合、配列に入っている要素をテキストボックスに表示するというものを作っています。
イメージ的にはIME日本語入力でスペースを押して変換し、さらにスペースを押す事で変換候補を表示していくのと同じようなものです。
半角スペースは判定できるのですが、全角スペースだった場合が判定できなくて困っております。if文の箇所で12288や-32448、String.fromCharCodeでチェックをしても全角スペースとして判定されません。
現在はkeypressで行っていますが、keydownにしたところ、keyCodeの中身が299となり判定できたのですが、半角/全角キーやカタカナひらがなキーも299として判定されてしまい、全角スペースと区別する事ができませんでした。

以下がソースです。

<script type="text/javascript">
		<!--
			//変換候補配列
			str = new Array("青","あお","蒼","阿保","粟生");
			//配列の要素数
			var len;
			//テキストフィールドの文字数
			var TxtLen;
			//テキストフィールドの文字列
			var TxtStr;
			//変換文字数
			var HenLen;
			//変換前入力文字数(今回は2文字で固定)
			ChgMoji=2;
			//要素カウント
			i=0;
			//フラグ 0:未変換 1:変換中
			flg=0;
			
			function ChkSpace()
			{			
			//入力文字がスペースかつ未変換
				if(event.keyCode == 32 && flg == 0)
				{
					//キー入力を無効に
					event.keyCode=0;
					flg = 1
					//配列の要素数を取得
					len=str.length-1;
					//テキストフィールドの値を取得
					TxtStr = document.Form1.txtText.value;
					//テキストフィールドの文字数を取得
					TxtLen=TxtStr.length;
					//テキストフィールドの文字数-変換する文字数
					//変換する文字列以外を抽出
					TxtLen=TxtLen-ChgMoji;
					TxtStr=TxtStr.substr(0,TxtLen);
					document.Form1.txtText.value=TxtStr + str[i];
					//変換した文字列の文字数をセット
					HenLen = str[i].length;
					if(i == len){i=0;}else{i=i+1;}
				}
				else
				{	//入力文字がスペースかつ変換中
					if(event.keyCode == 32 && flg == 1)
					{
						//キー入力を無効に
						event.keyCode=0;
						//テキストフィールドの値を取得
						TxtStr = document.Form1.txtText.value;
						//テキストフィールドの文字数を取得
						TxtLen=TxtStr.length;
						//テキストフィールドの文字数-前変換文字数
						//変換する文字列以外を抽出
						TxtLen=TxtLen-HenLen;
						TxtStr=TxtStr.substr(0,TxtLen);
						document.Form1.txtText.value=TxtStr + str[i];
						//変換した文字列の文字数をセット
						HenLen = str[i].length;
						if(i == len){i=0;}else{i=i+1;}
					}

				}
			}
		 -->
		</script>



どなたかアドバイスお願い致します。

1   名前: ABDS : 2006/05/31(水) 13:29  ID:EnWNHqjc
すいません。299ではなく229の間違いでしたorz
また、コードの方、読みづらくてすいません。

2   名前: Pid ◆byEkK9OALr : 2006/05/31(水) 13:29
確認ですが,必要なのはキーコードですか。それとも文字のコードポイントですか。

IE 専用のようですから,いっそ input { ime-mode: disabled; } にしておけば,IME の状態に左右されずに済むと思います。


※ substr は ECMA 262-3 で廃止されました。これから作るなら substring を使って下さい。

3   名前: ABDS : 2006/05/31(水) 13:29  ID:EnWNHqjc
Pid様ご返信ありがとうございます。説明が足りませんでしたね。必要なのはコードポイントです。
>IE専用
現在の所IE以外での使用は考えられていませんので、IE専用です。

>IME
IME日本語ONの状態で、全角スペースを判定したいのでdisabledにするわけにもいかないんですorz

>substr
そうだったんですか……わざわざありがとうございますm(_ _)m

4   名前: Pid ◆byEkK9OALr : 2006/05/31(水) 13:29
私がまだ頭を整理できていないので,勘違いしておりましたらご容赦を。

<p>
  <input type="text" value="" onkeyup="
    alert ( [ 'KeyCode:'  + event.keyCode, 
              'CharCode:' + this.value.charCodeAt (this.value.length - 1) ] );
  ">
</p>


を試せばお分かりのように,「どのキーが押されたか」は「どの文字が出力されたか」とは基本的に無関係です。「どの文字が出力されたか」を知るには,上記のように,keyup イベント直後に value 属性値の最後の文字を切り出せば良いと思います(一応,全角空白(12288,\u3000)のチェックはできました)。

※ WinIE ならもっとスマートな方法があるかもしれませんが,ちょっと探せませんでした。

5   名前: ABDS : 2006/05/31(水) 13:29  ID:EnWNHqjc
PID様、ご返信ありがとうございます。
>「どのキーが押されたか」は「どの文字が出力されたか」とは基本的に無関係です。

そうだったんですか……勘違いしてましたorz
キーを押された=そのキーの文字が出力されると思ってました……。
PID様の貼られたソースのおかげで、無事完成できました。
以下、完成したコードです。
<HTML>
<HEAD>
<title>配列テスト</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
	<script type="text/javascript">
	<!--
		//変換候補配列
		str = new Array("赤","あか","垢","アカ","閼伽","亜科","銅","淦");
		//配列の要素数
		var len;
		//テキストフィールドの文字数
		var TxtLen;
		//テキストフィールドの文字列
		var TxtStr;
		//変換文字数
		var HenLen;
		//変換前入力文字数
		ChgMoji=2;
		//要素カウント
		i=0;
		//フラグ 0:未変換 1:変換中
		flg=0;
			
		function ChkSpace()
		{

			//入力文字がスペースかつ未変換
			if(document.Form1.txtText.value.charCodeAt (document.Form1.txtText.value.length - 1) == 12288 && flg == 0)
			{

				//キー入力を無効に
				event.keyCode=0;
				flg = 1
				//配列の要素数を取得
				len=str.length-1;
				//テキストフィールドの値を取得
				TxtStr = document.Form1.txtText.value;
				//テキストフィールドの文字数を取得
				TxtLen=TxtStr.length;
				//テキストフィールドの文字数-変換する文字数
				//変換する文字列以外を抽出
				TxtLen=TxtLen-ChgMoji;
				TxtStr=TxtStr.substr(0,TxtLen);
				document.Form1.txtText.value=TxtStr + str[i];
				//変換した文字列の文字数をセット
				HenLen = str[i].length;
				if(i == len){i=0;}else{i=i+1;}
			}
			else
			{	//入力文字がスペースかつ変換中
				if(document.Form1.txtText.value.charCodeAt (document.Form1.txtText.value.length - 1) == 12288 && flg == 1)
				{
					//キー入力を無効に
					event.keyCode=0;
					//テキストフィールドの値を取得
					TxtStr = document.Form1.txtText.value;
					//テキストフィールドの文字数を取得
					TxtLen=TxtStr.length;
					//テキストフィールドの文字数-前変換文字数
					//変換する文字列以外を抽出
					TxtLen=TxtLen-HenLen;
					TxtStr=TxtStr.substr(0,TxtLen);
						document.Form1.txtText.value=TxtStr + str[i];
					//変換した文字列の文字数をセット
					HenLen = str[i].length;
					if(i == len){i=0;}else{i=i+1;}
				}

			}
		}
	 -->
	</script>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="MS UI Gothic"><INPUT size="20" value="" onkeyup="ChkSpace();" type="text" name="txtText"></FONT>
</form>
</body>
</HTML>


PID様、本当にありがとうございましたorz

6   名前: ABDS : 2006/05/31(水) 13:29  ID:EnWNHqjc
先ほどの投稿でPid様の名前を全て大文字で表記してしまいました。
Pid様、申し訳ありませんorz

一覧へ戻る