JavaScriptでpromptの入力と文字列を比較するには?

[上に] [前に] [次に]
わくわく [E-Mail] 2000/03/29(水) 20:58:59
始めましてわくわくともうします。
JavaScriptのについての質問です。
キーボード練習用のページを作ろうと、インターフェースを検討してい
るのですが、その一つにpromptに問題を表示して入力し、promptの戻
す文字列と、配列にした問題の文字列を比較したいのですがうまくでき
ません。alertで表示してみると確かに同じなのですが、

半角アルファベットではうまくいくのですが...
/*端折ったソースです*/
str=prompt(mondai[num],"");
if (mondai[num]==str) { /* mondaiは文字列の配列です。*/
   alert("正解");
}

ユニコードとかの関係なんでしょうか?
(そもそもユニコードって何ですか?)
ブラウザはIE5.0です。
よろしかったら教えてください。

H&A 2000/03/29(水) 21:43:47
手元の Windows 98 + Internet Explorer 5.0 で試したところでは、全角文字を含んだ場合に str にゴミがつくみたいです。mondai[num] と str をそれぞれ escape() でエスケープした結果を表示させてみるとわかります。
他の環境で試していないので詳しくはわかりませんが、Internet Explorer 5.0 (5.01 も?) のバグ or 仕様ではないかと思います。

ゴミは必ず文字コード 0 から始まっているみたいなので、文字コード 0 以降を削除すれば回避できるみたいです。

H&A 2000/03/29(水) 21:53:23
続報です。
Internet Explorer では全角文字を 1 文字と数えますが、prompt() で返された文字列は全角文字を 2 文字と数えているようです。
このため、全角文字が含まれている場合には含まれた全角文字数分だけ全体の文字数が増えてしまっています。

わくわく 2000/03/29(水) 22:13:04
お返事有り難うございまいした。
こんなにすぐに教えていただけるとは思っていませんでした。
(うれしいです)
さて、さっそく下のようなソースを書いて試してみました。
mondai = new Array();
mondai[0]="こんにちは";
function test()
{
str = prompt("input :"+mondai[0],"");
document.form1.text1.value=escape(str);
document.form1.text2.value=escape(mondai[0]);
}

すると こんにちは と入力すると、
strは
  %u3053%u3093%u306B%u3061%u306F%00%u8410E%00%00
でした。
mondai[0]は
  %u3053%u3093%u306B%u3061%u306F
でした。
「 %00%u8410E%00%00 」というのが「ゴミ」のことですね。

でもこれをどうやったら、比較できる形になるのでしょう?
ちなみに、私もlengthで調べてみたら、長さが違うので????でした。
それから、onkeydownイベントで、押されたキーのキーコードと
テキストボックスのvalueの比較もうまくできないんですが...
こちらは、タッチタイプ特訓ページに使おうと思っているのですが、
何か共通した問題のような気がしますが...
見当違いならごめんなさい。

shin' 2000/03/29(水) 23:09:31
毎回「%00%u8410E%00%00」がつくなら、
↑これ、5文字分だから、
mondai[0]=str.substring(1,str.length-5)
とか。
unescape("%00")はキーボードから入力できないと思うので、
%00以降を切り捨てるとか。

安芸川晴海 2000/03/29(水) 23:13:07
ごみとりの方法としては、
function FixStr(str)
{
var i=0;
var rv="";
while(i<str.length && str.charCodeAt(i)!=0)
{
rv+=str.charAt(i);
i++;
}
return rv;
}
でしょうか。
もう一つの問題のほうはまだ良く状態を確認していないのでわかりません。

H&A 2000/03/30(木) 10:15:14
Windows 98 上で
  ・標準の Internet Explorer 4.0 (4.72.3110.1)
  ・Netscape Communicator 4.5
Windows NT 4.0 Server 上で
  ・Office2000 付属の Internet Explorer 5.0 (5.00.2314.1003)
Windows 2000 Server 上で
  ・標準の Internet Explorer 5.0 (5.00.2920.0000)

…という環境で同様のテストをしてみました。
その結果、ゴミがつくのは Windows 98 + Internet Explorer 4.0 (&5.0) のみということが判明しました。
Internet Explorer 3.0 (3.02) でのテストができないのが残念…

ということで、対症療法としては安芸川晴海さんの書かれた関数を使って

str = prompt("input :"+mondai[0],"");
if(str != nulll) str = FixStr(str);

とするのがよろしいかと思います。

> それから、onkeydownイベントで、押されたキーのキーコードと
> テキストボックスのvalueの比較もうまくできないんですが...

こちらはどのような現象になるのでしょうか?
よろしければ、サンプルとあわせて教えてくださいませ。

わくわく [E-Mail] 2000/03/30(木) 11:14:29
いろいろと、有り難うございます。
ひょっとすると、基本的な間違いかもしれませんが
テキストボックスにアルファベットの1文字(たとえば "a" )
がvalueに設定してあって、(これにあわせてユーザがキーを打つわけです。)
キーボードの "a" を押したかどうか、判定したいのです。
テキストボックスに設定してある値と、onkeydownイベントで
取得したキーコードを比較できないものでしょうか?

最終的には、テキストボックスに "ekidekifusuru" などと設定し、
該当する1文字ごとに判定を繰り返しながら、タッチタイプをマスターしてもらうようなページを考えています。
それをしようと思っても、なかなかうまくいかないのです。
charCodeAt()なんかを使ってみるのですが...
キーコードを表示してみても、違う番号が出てくるし、
lengthもなぜか違うし、
何がいけないのか良く分かりません。
スクリプトがすぐに見つからないので、また作ってから書き込みます。
かな漢字変換の練習ページについては、何とかなりそうなんですが...

H&A 2000/03/30(木) 19:31:16
今更になってわくわくさんのおっしゃっていた「キーコードと value がうまく比較できない」というのがわかりました。
どうも、Internet Explorer では取得できるキーコードが Netscape Navigator と異なるようです。

・キーボードの "a" を押したとき
    IE:65 NN:97
・Shift を押したとき
    IE:16 NN:キー押下イベントが発生しない
・Shift + "a" を押したとき
    IE:65 NN:65
・CapsLock して "a" を押したとき
    IE:65 NN:97

ということで、Netscape Navigator ではテキストボックスに入力した際に画面表示される文字のコードと一致しているようですが、Internet Explorer ではシフト状態に左右されないコードになるみたいです。
「キーコード」という意味ではこちらのほうが正しいとは思いますが、テキストボックス内の値と直接比較できないのは不便ですね。
また、アルファベットに限っていえばキーコードは「その文字の大文字のコード」に対応しているようです。

キー押下イベントの取得方法も Internet Explorer と Netscape Navigator で異なりますので、タイプレッスンを作るにはブラウザを限定するかブラウザ種別によって作り分ける必要がありますね。

それにしても、タッチタイプ特訓ページというのは面白そうですね!
完成したら、私にもチャレンジさせてください。

shin' 2000/03/31(金) 01:24:42
クロスブラウザにする必要があるなら、
IE用とNetscape用ページに分けて、
IEでちゃんと文字コードを返さないのはVBScriptで処理かな。
きっと1ページでやるほうが時間と手間かかると思います。

H&A 2000/03/31(金) 09:36:08
> ・CapsLock して "a" を押したとき
>    IE:65 NN:97

CapsLock して "a" を押したときは、NN ではキーコード 65 です。
間違っておりました。

> きっと1ページでやるほうが時間と手間かかると思います。

そうですね。
KeyDown イベントの取得法も処理法も異なるし、ページごと分けてしまうのが簡単だと思います。
あるいは、外部スクリプトファイルをブラウザごとに分けるとか。

a 2000/03/31(金) 10:25:48
>それにしても、タッチタイプ特訓ページというのは面白そうですね!
簡単なやつなら、以下にあります。

http://www.parkcity.ne.jp/~chaichan/src/typing.htm

わくわく 2000/03/31(金) 14:09:37
> H&Aさんへ
本当に有用な知識を教えていただきまして、有り難うございます。
私も、色々なプラットフォームや、ブラウザで試してみなければ
いけないと痛感しました。
現在私はIE5を使用してページ作成の勉強をしていますが、
色々な事を念頭において作らないといけませんね。
とても勉強になります。
目標は、クロスブラウザ、(ページを分けるか、スクリプトを組むかは別として)キーボード練習ページ!!です。
とはいえ、まずは自分の環境で動かなきゃ....
意味のわかりにくい質問に丁寧にお応えいただいて感謝しています。

>shinさん
まさに「目から鱗」ですね。
ページロード時にブラウザを判別して外部スクリプトへのリンクの部分のタグをdocumennt.writeしてやれば良いのでしょうか?

>aさん有り難うございます。
タッチタイプ練習のページが
きっとどこかにあるはずだと思ったので探してみたんですが見つけることが出来なくて...感謝します。
私には絶対思い付かないインターフェースでした。
スクリプトもとても参考になりました。
少し私のイメージとは違いますが、これももいいなぁと思いました。
有り難うございます。
(VBスクリプトはまだほとんど勉強していないので今後の課題としたいと思います。)
>みなさんへ
このページがある程度完成しましたら、公開してみますので
ご意見、ご指導のほどよろしくお願いします。
さて、つくるぞ!

わくわく 2000/03/31(金) 18:07:59
[[解決]]
みなさんいろいろとありがとうございました。
ひとまず、皆さんから教えていただいた知識を使って
制作してみます。『解決』というのとは違いますが。
また、改めて疑問が出てきましたら。質問させてください。
有り難うございました。

[上に] [前に] [次に]