今回は、JSイベントバインディングとイベントフローモデルの使い方と、JSイベントバインディングとイベントフローモデルを使用する際の注意点について説明します。実際のケースを見てみましょう。
1. JSイベント
(1) JSイベント分類
1. マウスイベント:
click/dbclick/mouseover/mouseout
2. HTMLイベント:
onload/onunload/onsubミット/onresize/onchange/onfoucs/onscroll
3. キーボード イベント:
keydown: キーボードが押されたときにトリガーされます。
keypress: キーボードが押されて持ち上げられた瞬間にトリガーされます。
keyup: キーボードを上げるとトリガー
[注意事項]
①実行シーケンス: keydown keypress keyup
②keypressは数字、文字、記号キーのみをキャプチャでき、ファンクションキーはキャプチャできません。
③キーダウンを繰り返す - 長押ししたときにキーを押す
④長押ししたときにフォーカスが失われると、キーダウンが発生しますが、キーアップはトリガーされなくなります
⑤キーを押すと大文字と小文字が区別されます。キーダウンとキューアップは異なります。
4. イベント要素:
イベントがトリガーされると、イベントはデフォルトでイベントによって呼び出される関数にパラメーターを渡します。
このパラメーターはイベントのさまざまな詳細情報を含みます。 。
document.onkeydown=function(e){ console.log(e); } document.onkeydown=function(){ console.log(window.event); }
5. キーボードのキーを決定するにはどうすればよいですか?
①再起動関数内でイベント要因eを受け取ります。
② e.key を使用すると、押されたキーの文字に直接移動できます (非推奨)。
③keyCode/that/charCodeを使用して、キーのASCIIコード値を取得できます。
(各種ブラウザの記述方法に対応)
//兼容浏览器的写法: document.onkeydown=function(e){ e==e||Window.event; var Code=e.keyCode||e.which||e.charCode; if(code==13){ //回车 } }
(1) DOM0イベントモデル
バインディングメモ:
①window.onloadを使用して読み込みを完了させてからバインドします。
window.onload =function(){//事件}
②バインディング用のボディの後ろに置きます。
var Code=e.keyCode||e.which||e.charCode; //判断组合键 var isAlt=0,isEnt=0; document.onkeyup=function(e){ if(e.keyCode==18){ isAlt=1; } if(e.keyCode==13){ isEnt=1; } if(isAlt==1&&isEnt==1){ alert("同时按下Alt和Enter键"); } } document.onkeyup=function(){ console.log("keyup"); } document.onkeypress=function(){ console.log("keypress"); } document.onkeydown=function(){ console.log("keydown"); } document.onkeypress=function(){ console.log(window.event); } //判断是否按下了回车键 document.onkeydown=function(e){ var code=e.keyCode; if(code==13){ alert("你输入的是回车键"); } }
1. インラインモデル(インラインバインディング): HTMLタグ内の属性の属性値として関数名を直接使用します。
//body内容 <body> <button onclick="func()">内联模型绑定</button> <button id="btn1">哈哈哈哈</button> <button id="btn2">DOM2模型绑定</button> <button id="btn3">取消DOM2</button> </body>
短所: コンテンツと動作の分離に関する w3c の基本仕様に準拠していません。
2. スクリプト モデル (動的バインディング): JS でノードを選択し、そのノードに onclick 属性を追加します。
<button onclick="func()">内联模型绑定</button>
利点: コンテンツと動作の分離に関する w3c の基本仕様に準拠し、html と js の分離を実現します。
欠点: 同じノードは同じタイプのイベントを 1 回しか追加できません。複数回追加すると、最後のものが有効になります。
document.getElementById("btn1")=function(){}
3.DOM0 には共通の欠点があります。DOM0 を介してバインドされたイベントは、バインド後にキャンセルすることはできません。
document.getElementById("btn1").onclick=function(){ alert(1234); } document.getElementById("btn1").onclick=function(){ alert(234); }//重复的只能出现最近的一次
(2) DOM2 イベントモデル
1. DOM2 イベントバインディングを追加します:
①IE8 より前では、.attachEvent("onclick", function) を使用します
②IE8 以降では、.addEventListener("click", function, true / false);
パラメーター 3: false (デフォルト) はイベント バブリングを意味し、true を渡すとイベント キャプチャを意味します。
③ すべてのブラウザ処理メソッドと互換性があります:
document.getElementById("btn3").onclick=function(){//不能取消匿名函数 if(btn.detachEvent){ btn.detachEvent("onclick",func1); }else{ btn.removeEventListener("click",func1); } alert("取消DOM2"); }
2. DOM2 バインディングの利点:
① DOM2 を使用すると、同じノードを同じ種類の複数のイベントにバインドできます。
②DOM2を使用してバインドされたイベントは特別な関数でキャンセルできます。
3. イベントバインディングのキャンセル:
①attachEventを使用してバインドし、detacheventを使用してキャンセルします。
②attachEventListenerを使用してバインドし、removeEventListenerを使用してキャンセルします。
注: DOM2 にバインドされたイベントをキャンセルする必要がある場合、イベントをバインドするときに、 コールバック関数 は関数名である必要があり、匿名関数にすることはできません。イベントをキャンセルするときに渡される関数名はキャンセル。
3. JSイベントフローモデル
(1) JSのイベントフローモデル1. 事件冒泡(fasle/不写):当触发一个节点的事件是,会从当前节点开始,依次触发其祖先节点的同类型事件,直到DOM根节点。
2. 事件捕获(true):当初发一个节点的事件时,会从DOM根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。
3. 什么时候事件冒泡?什么时候事件捕获?
① 当使用addEventListener绑定事件,第三个参数传为true时表示事件捕获;
② 除此之外的所有事件绑定均为事件冒泡。
4. 阻止事件冒泡:
① IE10之前,e.cancelBubble = true;
② IE10之后,e.stopPropagation();
5. 阻止默认事件:
① IE10之前:e.returnValue = false;
② IE10之后:e.preventDefault();
//css #p1{ width: 300px;; height: 300px; background-color: powderblue; } #p2{ width: 200px; height: 200px; background-color: deeppink; } #p3{ width: 100px; height: 100px; background-color:#A9A9A9; } //html <p id="p1"> <p id="p2"> <p id="p3"></p> </p> </p> <a href="01-事件笔记.html" rel="external nofollow" onclick="func()">超链接</a> p1.addEventListener("click",function(){ console.log("p1 click"); },false); p2.addEventListener("click",function(){ console.log("p2 click"); },false); p3.addEventListener("click",function(){ //原来的顺序是:3-->2-->1。 // myParagraphEventHandler(); //截获事件流后,只触发3.但是从2开始依然会冒泡; console.log("p3 click"); },false);
结果(事件冒泡)(由小到大p3-》p2-》p1):
p1.addEventListener("click",function(){ console.log("p1 click"); },true); p2.addEventListener("click",function(){ console.log("p2 click"); },true); p3.addEventListener("click",function(){ // myParagraphEventHandler(); //截获事件流后,只触发3.但是从2开始依然会冒泡; console.log("p3 click"); },true);
结果(事件捕获)(由小到大p3-》p2-》p1):
//依然遵循事件冒泡 document.onclick=function(){ console.log("document click") } //截获事件流阻止事件冒泡 function myParagraphEventHandler(e) { e = e || window.event; if (e.stopPropagation) { e.stopPropagation(); //IE10以后 } else { e.cancelBubble = true; //IE10之前 } } //截获事件流阻止事件冒泡 function myParagraphEventHandler(e) { e = e || window.event; if (e.stopPropagation) { e.stopPropagation(); //IE10以后 } else { e.cancelBubble = true; //IE10之前 } } //阻止默认事件 function eventHandler(e) { e = e || window.event; // 防止默认行为 if (e.preventDefault) { e.preventDefault(); //IE10之后 } else { e.returnValue = false; //IE10之前 } }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がJSイベントバインディングとイベントフローモデルの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。