関数を学習する際には、多くの関数イベントが発生します。この記事では、それらについて詳しく説明します。
イベントとは何ですか?
JavaScript と HTML 間の対話はイベントを通じて実現されます。イベントは、ドキュメントまたはブラウザ ウィンドウ内で発生する対話の特定の瞬間です。リスナー (またはハンドラー) を使用してイベントをスケジュールし、イベントの発生時に適切なコードが実行されるようにすることができます。従来のソフトウェア エンジニアリングではオブザーバー パターンとして知られるこのモデルは、ページの動作 (JavaScript) とページの外観 (HTML および CSS) の間の疎結合をサポートします。
イベント フロー
イベント フローは、ページからイベントを受け取る順序を記述します。次のコードを想定します:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <div id="div1"></div></body></html>
div をクリックします。このクリックは div 上で発生するだけでなく、その親コンテナー本体もクリックされます。では、誰が最初にクリックされたのか、またイベントはどのように広がったのでしょうか?イベント ストリームは、このような一連の受信イベントを記述します。
IE イベント フロー (イベント バブリング)
IE イベント フローはイベント バブリングとも呼ばれます。つまり、イベントは最初に最も特定的な要素 (ドキュメント内で最も深いネスト層を持つノード) によって受信され、次に次の要素に伝播します。特定性の低い要素をステップごとに説明します。
上記のコードを例にとると、div 要素をクリックすると、クリック イベントは次の順序で伝播されます:
1.<div> 2.<body> 3.<html> 4.document
つまり、最初にクリック イベントが div 要素で発生し、これがelement は要素をクリックしたものであり、クリック イベントは DOM ツリーを上に伝播し、ドキュメント オブジェクトに伝播するまでノードの各レベルで発生します。
最新のブラウザはすべてイベント バブリングをサポートしていますが、いくつかの違いがあります。 IE5.5 以前のバージョンのイベント バブルは、html 要素をスキップし、本文からドキュメントに直接進みます。 IE9、Firefox、Chrome、Safari では、イベントがウィンドウ オブジェクトまでバブルされます。 (古い IE ブラウザはイベント バブリングのみをサポートします)。
イベント キャプチャ
イベント キャプチャの考え方は、特定性の低いノードがより早くイベントを受信し、特定のノードが最後にイベントを受信するというものです。これは、上の例を再度取り上げると、div をクリックします。 、イベント キャプチャのイベント トリガー シーケンスは次のとおりです。
1.document 2.<html> 3.<body> 4.<div>
イベント キャプチャ プロセス中、ドキュメント オブジェクトは最初にクリック イベントを受け取り、次にイベントは、実際のターゲットに到達するまで DOM ツリーに沿って下方向に伝播されます。イベント。
IE9、Firefox、Chrome、Safari、Opera はすべてイベント キャプチャをサポートしています。 DOM2 レベルのイベント仕様では、イベントがドキュメント オブジェクトから伝播を開始する必要がありますが、これらのブラウザはウィンドウ オブジェクトからイベントのキャプチャを開始します。
DOM イベント フロー
DOM レベル 2 イベントによって指定されるイベント フローには、イベント キャプチャ ステージ、ターゲット ステージ、イベント バブリング ステージの 3 つのステージが含まれます。最初に行われるのはイベントのキャプチャであり、イベントを傍受する機会が提供されます。その後、実際のターゲットがイベントを受信します。最後のフェーズはバブリングフェーズで、イベントに応答できます。
DOM イベント ストリームでは、実際のターゲットはキャプチャ フェーズ中にイベントを受信しません。これは、キャプチャ フェーズ中、ドキュメントから HTML、本文までのイベントが停止されることを意味します。次のステージはターゲット ステージ内にあるため、イベントは div 上で発生し、イベント処理のバブリング ステージの一部とみなされます。次に、バブリングフェーズが発生し、イベントがドキュメントに戻されます。
しかし、実際には、IE9、Firefox、Chrome、Safari、Opera9.5 以降では、キャプチャ フェーズ中にイベント オブジェクトでイベントがトリガーされます。その結果、ターゲット オブジェクトのイベントを操作する機会が 2 つ存在します。 (IE8 以前のバージョンは DOM イベント ストリーミングをサポートしていません)。
イベントハンドラー
イベントとは、ユーザーまたはブラウザ自体によって実行されるアクションです。クリック、ロード、マウスオーバーなどはすべてイベント名です。イベントに応答する関数をイベントハンドラ(イベントリスナー)と呼びます。イベント ハンドラーの名前は「on」で始まるため、クリック イベントのイベント ハンドラーは onclick、load イベントのハンドラーは onload になります。イベントのハンドラーを指定するにはいくつかの方法があります。
HTML イベント ハンドラー
要素によってサポートされる各イベントは、対応するイベント ハンドラーと同じ名前の HTML 属性を使用して指定できます。この属性の値は、実行可能な JavaScript コードである必要があります。例:
<button id="myButton" onclick="alert('Clicked')">Click Me</button>//定义了一个按钮,点击时会显示一个警告框;
HTML でのイベント ハンドラーの定義には、実行する特定のアクションを含めることができます。または、ページ上の他の場所で定義されたスクリプトを呼び出すこともできます。例:
<button id="myButton" onclick="showMsg()">Click Me</button> //点击按钮就会调用showMsg()函数;<script> function showMsg() { alert('Hello world!') }</script>
HTML 経由イベント ハンドラーを指定すると、次の 2 つの欠点があります。1. ユーザーは HTML 要素がページに表示されるとすぐに対応するイベントをトリガーする可能性があるため、時間差の問題が発生します。ただし、この時点ではイベント ハンドラーに実行条件がない可能性があります。2. HTML とJavaScript コードは密接に関連しているため、イベント ハンドラーを変更したい場合は、HTML コードと JavaScript コードを変更する必要があります。
DOM レベル 0 イベント ハンドラー
JavaScript を通じてイベント ハンドラーを指定する従来の方法は、イベント ハンドラー プロパティに関数を割り当てることです。各要素には独自のイベント ハンドラー属性があり、通常はすべて小文字です (onclick など)。この属性の値を関数に設定することで、イベント ハンドラーを指定できます。例:
var btn = document.getElementById('myButton'); btn.onclick = function() { alert("Clicked") }
使用DOM0级方法指定的事件处理程序被认为是元素的方法。因此,这时候事件处理程序是在元素的作用域中运行;换句话说,程序中的this引用当前元素。
也可以通过DOM0级方法删除事件处理程序,示例:
btn.onclick = null; //删除事件处理程序; DOM2级事件处理程序
DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()。所有DOM节点都包含这两个方法,并且它们都接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后的布尔值如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。示例:
var btn = document.getElementById('myButton'); //为按钮添加了click事件和处理程序; btn.addEventListener('click',function() { alert(this.id) },false)
与DOM0级方法一样,这里添加的事件处理程序也是在其依附的元素的作用域中运行的。使用DOM2级方法添加事件处理程序可以添加多个事件处理程序,示例:
var btn = document.getElementById('myButton'); //为按钮添加了多个click事件和处理程序; btn.addEventListener('click',function() { alert(this.id); },false); var btn = document.getElementById('myButton'); ; btn.addEventListener('click',function() { alert('hello world!'); },false);
这里为按钮添加了2个事件处理程序。这两个事件处理程序会按照添加它们的顺序触发。
通过addEventListener()添加的事件处理程序只能用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同,意味着addEventListener()添加的匿名函数无法移除:
//该代码无法运行;btn.removeEventListener('click',function() { alert(this.id); },false); //该代码工作正常;//removeEventListener()和addEventListener()使用了相同函数;var btn = document.getElementById('myButton'); var function handler() { alert(this.id); } btn.addEventListener('click',handler,false); btn.removeEventListener('click',handler,false);
本篇对js事件进行了总结,更多相关内容请关注php中文网。
相关推荐:
以上が関数イベントの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。