ホームページ >ウェブフロントエンド >jsチュートリアル >JSイベントバインディングとイベントフローモデルケース分析

JSイベントバインディングとイベントフローモデルケース分析

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-22 09:52:501219ブラウズ

今回はJSイベントバインディングとイベントフローモデルの事例分析をお届けします。JSイベントバインディングとイベントフローモデルを使用する際の注意点とは何ですか。実際の事例を見てみましょう。

1. JSイベント

(1) JSイベント分類

1. マウスイベント:

click/dbclick/mouseover/mouseout

2. HTMLイベント:

 onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll

3. キーボードイベント:

keydown: キーボードが押されたトリガーされたwhen
keypress: キーボードが押されて持ち上げられた瞬間にトリガーされます。
keyup: キーボードを上げるとトリガー

[注意事項]

①実行シーケンス: keydown keypress keyup
②keypressは数字、文字、記号キーのみをキャプチャでき、ファンクションキーはキャプチャできません。
③キーダウンを繰り返します - 長押ししたときにキーを押します
④キーダウンがありますが、必ずしもキーアップするとは限りません。長押ししたときにフォーカスが失われると、キーアップはトリガーされなくなります
⑤キープレスは大文字と小文字を区別します。キーダウン、キューアップは異なりません。

4. イベント要素:

イベントがトリガーされると、イベントはデフォルトでイベントによって呼び出される関数にパラメーターを渡します。

このパラメーターはイベントのさまざまな詳細情報を含みます。 。

 document.onkeydown=function(e){
 console.log(e);
 }
document.onkeydown=function(){
console.log(window.event);
}
rree

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){
//回车
}
}

2. イベントバインディングモデル

(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内容
6c04bd5ca3fcae76e30b72ad730ca86d
  ac6d94d45af08d62f601c60315a41ead内联模型绑定65281c5ac262bf6d81768915a4a77ac0
  2b35a4bd2f218298ed835abd930b5962哈哈哈哈65281c5ac262bf6d81768915a4a77ac0
  fa1cdecaa9f71d90ec149b54d5226970DOM2模型绑定65281c5ac262bf6d81768915a4a77ac0
  4318a98e4d103d446d721f73b458035e取消DOM265281c5ac262bf6d81768915a4a77ac0
36cc49f0c466276486e50c850b7e4956

短所: コンテンツと動作の分離に関する w3c の基本仕様に準拠していません。

2. スクリプト モデル (動的バインディング): JS でノードを選択し、そのノードに onclick 属性を追加します。

ac6d94d45af08d62f601c60315a41ead内联模型绑定65281c5ac262bf6d81768915a4a77ac0

利点: コンテンツと動作の分離に関する 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
1543e05224819c12ab8136df28db3a2e
  5daf0f4c91d62e4731d4aa9ee9a1b709
    7280f502980e0d5ec16910135c6538dc94b3e26ee717c64999d7867364b1b4a3
  94b3e26ee717c64999d7867364b1b4a3
94b3e26ee717c64999d7867364b1b4a3
6b4fa9013772f692d8c074f2d220e434超链接5db79b134e9f6b82c0b36e0489ee08ed
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中文网其它相关文章!

推荐阅读:

jQuery实现无缝轮播与左右点击步骤详解

nodejs更改项目端口号步骤详解

以上がJSイベントバインディングとイベントフローモデルケース分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。