コードを調整して、何が起こっているのかを分離して詳細を提供するために、次の準備をしました。
http://jsfiddle.net/238Nz/8/
答えについては、この部分の下をスキップしてください。これはマークを対象としています。
on*
属性を使用してハンドラーを追加することが良いか悪いかを無視しましょう$。また、ログを使用して順序を確認しましょう。console.log()
ブラウザのJavascriptコンソールにメッセージを送信するために使用しています。FirefoxではFirebugを使用しており、Chromeにはコンソールが組み込まれています。どちらの場合も、ページを右クリックして、これらのテストInspect Element
のタブを選択します。Console
もう1つ、jsFiddleは、最初は理解するのが少し複雑になる可能性があります。左下のペインのJavascriptは、実際にはソース内の(およびタグ)の上のブロック内に配置されます。右クリックして下部の右()ペインを開くと、ブラウザが何を使用しているかがわかります。これは、jsFiddle用に並べ替えられた独自のサンプルHTMLドキュメントと同じです。ただし、それがどのように機能するかについて混乱しないようにしてください。head
input
body
View Source
Result
問題をテストするために使用しているマークアップは次のとおりです。
<input type="button" onclick="doclick()" onmouseout="domouseout()" value="Click">
関数にわかりやすくラベルを付け、説明的なエラーメッセージを使用していることに注意してください。これは、コードとメッセージログ情報にその詳細を埋め込むことで、何が起こっているかを追跡するのに役立ちます。またはのようなことをするのではなく、常にラベル(、、ログ情報など)を説明するようにしfunction
てvar
ください。スクリプトが長く複雑になると、それに従うのは非常に困難です。yay!
what happened
次に、次の関数を使用して、同じアクションを絞り込み、一貫して複製しました。
function popup(msg) {
// Note, console.log is first here. This is so that the
// alert does not "steal" focus before I get any result.
console.log(msg);
// Now, let's try the alert. Notice, the same msg is used.
alert(msg);
}
これにより、両方のイベントハンドラーから、両方を特定の順序でconsole.log
呼び出す ことができます。alert
次に、2つのイベントハンドラー関数を確立します。
function doclick() {
popup('onclick fired');
}
function domouseout() {
popup('onmouseout fired');
}
ほら、彼らがしているのは、何が起こるはずだったかpopup()
についてのアクション固有のログメッセージで呼び出すことだけです。はユーザーに「焦点を合わせ」、インタラクションをブロックするように設計されているため、ブラウザフレームが「フリーズ」した原因の可能性があります。alert
次に行うことは、さまざまなブラウザでこれを試すことです。常に異なるブラウザ間で複製してテストするようにしてください#。この場合、2つの間に大きな違いがあることに気づきます...
Chrome:処理をブロックしません。両方が起動alert
し、onmouseout
-firedは、とを押してマウスポインタを要素から移動するまで実行さalert
れません。これは、望ましい結果のようです。右?console.log
Ok
alert
input
Firefox(17.0.1):Firefoxはあなたが説明している動作を表示します。ボタンをクリックすると、両方が表示doclick
さ れ、同時にdomouseout()
呼び出されることに注意してください。そのため、Firefoxはマウスポインタをボタンから離していると検出し、「フリーズ」します。を見ると、両方がすぐに発砲し、(をクリックして)対話することができないように見えます。onclick
console
log
alert
Ok
IE(7-9、9互換表示):IEはもちろん興味深い図を提供します。たとえば、IE9のボタンをクリックすると、次のように表示されます。

http://i.imgur.com/sWXWm.png
もちろん、これはFirefoxが持っているのと同じ効果のように見えます...しかし、Firefoxの何らかの理由で、onmouseout
-firedは-firedalert
の上に焦点を合わせていません。IE 7-9と互換表示はすべて、わずかな違いはありますが、この特定の動作を示します。onclick
alert
Opera(12.02):Operaは、-firedおよびlogメッセージが完了するまで、-firedまたはメッセージを起動onmouseout
せalert
ず、マウスを移動します(クリックした後、ボタン要素からマウスを移動したと仮定します)。これは奇妙に思えますが、FirefoxやIEの動作よりも口当たりが良いです。たぶん私は間違っています。console.log
onclick
alert
input
では、何が起こっているのでしょうか。よくわかりませんが、がユーザーに焦点を合わせるのをonmouseout
妨げていると思います。凍結中にヒットすると、アラートは表示されますが、表示されません。Chromeはここでは正しいようです。Firefoxの「ポップアンダー」アラートは、まあ、ちょっと怪しいようです。onclick
alert
[Enter]
onclick
onmouseout
要約すると、少なくともこの場合の2つのイベントの動作は、 Firefoxに固有のものではありません。Firefox(少なくとも17.0.1)に固有のように見えるのは、-firedがonmouseout
正しくalert
フォーカスされておらず、ページが「フリーズしているように見える」という事実です。これはバグのようです。報告されているのかな?
$
通常、のようなインライン属性イベントハンドラーを使用することはお勧めできませんが、ここでのポイントの横にあるものは無視しましょう。MDNのドキュメント、特にHTML属性のセクションを参照してください。これは、ここで説明するよりも少し注意が必要で詳細です。<input onclick="doclick()"...>
DOM Event
#
ブラウザ内でJavascriptを使い続けると、IEが...特別であることがわかります。これは歴史上特別な場所であるため、IEのバージョンでコードをチェックするときの奇妙なまたは「異常な」動作は珍しいことではありません。個人的には、FirefoxまたはChromeで学習して作業し、IEや他のブラウザーで動作することを確認することをお勧めします。