WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:onClickイベントの発生について

0:[投稿] Micky [2002/06/25 17:04 ][環境:WIN+IE UNIX系+Java]

はじめまして。
早速で申し訳ありませんが、下のような html を作成して IE(5.5)
にて表示し、テキストを消した後、ボタンをクリックすると、
onChange イベントは発生するのですが、onClick イベントが
発生してくれません。
同じファイルを ネスケ(4.7) にて表示し、同様に操作すると、
onClick イベントは発生していました。
このような現象についてご存知の方がいらっしゃいましたら、
お教え頂けないでしょうか。

ちなみに、alert() の部分を document.a.b.value="test" の
ようにすると、IEでも onClick イベントは発生しました。

html ファイルは以下の通りです。
-----<ここから>-----------------------------------------
<HTML><TITLE>テスト</TITLE>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<SCRIPT LANGUAGE="JavaScript">
<!--
function Check() {
  if(document.a.b.value=="") {
     alert("null text");
  }
}
function Click() {
  alert("clicked");
}
// -->
</SCRIPT></HEAD>
<BODY><FORM NAME=a>
<INPUT TYPE=text NAME=b VALUE="test" onChange="Check()">
<INPUT TYPE=button NAME=c VALUE="Push" onClick="Click()">
</FORM></BODY></HTML>
-----<ここまで>-----------------------------------------


1:[回答] すたぁ [2002/06/25 18:31 ]

この質問(というかプログラム)なのですが、私はこう解釈しました。

 テキストボックスに、何かの文字が入力されている状態でボタンを押すと、
    "clicked"メッセージが表示され
 テキストボックスに、何も文字が入力されていない状態でボタンを押すと、
    "null text"メッセージが表示される

この解釈ならこの構文でいいかなと思ったその時、まず何か入力されている状態で、
ボタンを押すと、当然 "clicked" の発生。その後、テキストの文字を消し、
再度ボタンを押すと、"null text" の発生。ここまではいいです。
その後(何も入力されてない状態で)もう一度ボタンを押すと、なぜか "clicked" の発生。
何も入力されていないので、"null text" が表示されるのではないのかなぁと。

こういう解釈でいいのかわかりませんが、もしこうなら直すべきところはわかると思いますので
ご自身でお調べくださいね ^^。いかがでしょうか?


2:[回答] Micky [2002/06/25 19:12 ]

すたぁ さん。早速の Res、ありがとうございます。

少々、説明が足りない点があったかと思いますので、補足致します。
ここにのせたプログラムは、この現象を再現するためにテスト用で
小さいプログラムを作ってみたものです。実際のプログラムでは、
テキストボックス等はもっと多く設置してあり、その中で以下の
ようなことをしたいと考えています。
 1.テキストボックスに対して入力した内容をチェックする。
 2.ボタンをクリックしたら全ての入力データをチェックして、
   問題がなければデータを保存する CGI プログラムを動かす。
 3.中には、テキストボックスに入力して、そのままボタンを
   クリックする人もいるので、そのような場合に onClick
   イベント内で二重チェックを回避する。
   そのままの状態で再度ボタンをクリックした時には、2.の
   チェックが有功となる。
といった感じです。

ちなみに、
> その後(何も入力されてない状態で)もう一度ボタンを押すと、なぜか "clicked" の発生。
> 何も入力されていないので、"null text" が表示されるのではないのかなぁと。
については、onClick イベントなので、変更されていなければ
"null text" が表示されないということで間違ってはいません。

で、話は戻りますが、テキストを変更してそのままボタンを
クリックした時に、IEではボタンの onClick イベントが
発生しない(ネスケでは発生する)ということについての
質問だったのですが、おわかり頂けましたでしょうか?


3:[回答] すたぁ [2002/06/25 19:35 ]

>テキストを変更してそのままボタンをクリックした時に、
>IEではボタンの onClick イベントが発生しない
>(ネスケでは発生する)ということについて

IE5.5,NN4.7,Win2000環境でやってるんですが、
私の方だと両方とも同じ結果が返ってくるのですが・・・?
(↑私がおかしい?)
他の方はどうなのでしょうか・・・?

お役に立てずに申し訳ありませんm(__)m


4:[回答] Micky [2002/06/25 19:52 ]

> IE5.5,NN4.7,Win2000環境でやってるんですが、
> 私の方だと両方とも同じ結果が返ってくるのですが・・・?
当方の環境は WindowsNT4.0(SP3) です。
その辺の違いがなにかあるのかもしれませんね。

あと、ネスケのバージョンは 4.7 ではなく 4.6の勘違いでした。
大変申し訳ありません。
ネスケのバージョンの違い等もあったのかもしれませんね。
(同じ結果というのは両方とも発生しないということなのでしょうか?)

とにかく、ブラウザによってイベントが発生したりしなかったりでは、
困ることになるので、他の方の Res を待ってみたいと思います。

すたぁ さん。どうもありがとうございました。


5:[回答] おーなーしぇふ [2002/06/25 23:28 ]

IE5.5で試してみました。
1)カーソルをあててテキストを選択
2)デリートキーで消去
3)カーソルをボタンに移動
4)ボタンをクリック

で、確かに『onChange イベントは発生するのですが、onClick イベントが発生してくれません。』という結果でした。

この原因はおそらくalertにある、と思われます。例えば「window.status = "null text";」としてみると、うまくいくはずです。

IEの場合、alertがダイアログボックスを表示した時、スクリプトが処理を明け渡すことを強制し、その結果表示が更新されてしまうそうです。
http://www.microsoft.com/japan/msdn/columns/dude/dude02262001.asp
(ここの「スクリプトの処理の明け渡し」などを参考)

今回のケースでは、alertによりonClick以前の表示に更新される(元に戻る?)ことでonClickイベントが発生しないのではと思われます。
※つまり、IEの仕様が原因?


おまけですが、表示の更新の実験としてこんなのを試してみると興味深い結果が得られるかと。


●onFocusによるalertが2回でてしまう?
<HTML><TITLE>テスト</TITLE>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<SCRIPT LANGUAGE="JavaScript">
<!--
function Check() {
    if(document.a.b.value=="") {
//        alert("null text");
        window.status = "null text";
    }
}
function Click() {
    document.a.dmy.focus();
    alert("clicked");
    //このalertがあるとonFocusによるalertが2回でる
    //このalertがないとonFocusによるalertが1回だけ
}
n=0;
// -->
</SCRIPT></HEAD>
<BODY>
<FORM NAME=a>
<INPUT TYPE=text NAME=b VALUE="test" onChange="Check();">
<INPUT TYPE=button NAME=c VALUE="Push" onClick="Click();">

<INPUT TYPE=button NAME=dmy VALUE="dmy" onFocus="alert(n++);">

</FORM></BODY></HTML>


6:[完了] Micky [2002/06/26 09:41 ]

おーなーしぇふ さん。Res、どうもありがとうございます。

> IEの場合、alertがダイアログボックスを表示した時、スクリプトが処理を明け渡すことを強制し、その結果表示が更新されてしまうそうです。
> 今回のケースでは、alertによりonClick以前の表示に更新される(元に戻る?)ことでonClickイベントが発生しないのではと思われます。
> ※つまり、IEの仕様が原因?
なるほど、スクリプトエンジンがディスプレイエンジンに処理を
明け渡した結果、その後のスクリプトが中断されてしまうのですね。

しかし、ディスプレイエンジンが処理を終了した後、スクリプト
エンジンが残りの処理を継続してもよさそうなものなのに・・・
まあ、この場合にはそのようになっているので「しょうがない」
ということなのでしょうか・・・

とにもかくにも、色々お調べ頂いて、ありがとうございました。
一応、この件に関しては完了ということにさせて頂きます。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World