js標準イベントモデル、イベント登録のいくつかの方法とその違い、イベント委託メカニズム

45367 ワード

js標準イベントモデル、イベント登録のいくつかの方法とその違い、イベント委託メカニズム


一、イベント登録

  • イベントの3要素:イベントソース、イベント、イベント処理関数
  • 登録イベントとは、イベントソースに1種類のイベントを登録する、そのイベントに対する処理関数
  • を登録することである.
  • イベント応答:非同期応答動作であり、一般的には値は返されないが、多くのイベントに対しては、設定されたイベント処理関数に基づいてデフォルトの動作があり、もちろん戻り値を設定して論理演算などの
  • を行うこともできる.
  • イベント処理関数:一般的にはパラメータは伝達されません.標準ブラウザでは、イベント処理関数はイベントオブジェクトであるevent実パラメータをデフォルトで伝達します.イベントが発生すると、イベントメッセージはイベントオブジェクトを介して伝播されます.
  • 1、従来方式の登録イベントの傍受
  • タグにイベントリスニング属性を追加し、値は反応関数
  • である.
    <button onclick = 'change()'></button>
    <script>
        function change(){
            alert('        ');
        }
    </script>
    
  • jsで要素を取得すると動的にイベントを追加する処理
  • <button></button>
    <script>
        let btn = document.querySelector('button');
        btn.onclick = function(){
            alert('        1');
        }
        btn.onclick = function(){
            alert('        2');
        }
    </script>
    

    注意:
  • イベントは一意性があり、1回しか登録できません.複数回登録すると、最後に登録したイベントに準じます.
  • 従来の方法で登録するイベント使用:ターゲット要素.イベント=nullはイベントをログアウトします.

  • 2、新しい方法
  • addEventListener(eventType,function,useCapture):eventType:イベントタイプ、従来のイベントタイプとは異なり、eventTypeは引用符を付け、イベントの前に'on'を付けることはできません.function:イベント応答関数は、内部関数と書くことも外部関数と書くこともできる.useCapture:Booleanタイプで、trueの場合はキャプチャフェーズで傍受し、falseの場合はバブルフェーズで傍受する.このパラメータが記入されていない場合、デフォルトはfalse、すなわちバブル
  • である.
  • removeEventListener(eventType,function,useCapture):イベントは取り消されますが、addEventListenerが登録したイベントの傍受のみは取り消されます.eventTypeとfunctionは登録時と同じである.
  •         <button></button>
    		<script type="text/javascript">
    			let btn = document.querySelector('button');
    			function change(){
    				alert(    );
    			}
    			btn.addEventListener('click',change,false);
    			btn.removeEventListener('click',change,false);
    		</script>
    

    IE 6-8の場合、attachEvent()およびdetachEvent()を使用してリスニングイベントを追加し、リスニングイベントを削除します.
    3、違い
  • 従来の方法で定義されたイベントは一意性を有し、1つの要素に対して1つのイベント
  • のみを定義することができる.
  • イベント傍受を使用する方法は、1つの要素に対して複数のイベントを定義することができ、イベントの実行順序は、定義された順序によって実行するものではない
  • である.
  • イベントのリスニング方法
  • をより柔軟に使用

    二、標準イベントモデル


    イベント処理関数のthis:単純なイベントモデルでは、thisは現在のイベントオブジェクトを表し、Eventオブジェクトのsrc Event(IE)またはtarget(標準オブジェクトモデル)が表す意味と同じです.
    1、標準イベントモデル(IE 8後)
    js標準イベントモデルはIE 8以降のブラウザに適用され、3つの部分に分かれています.
  • イベント伝播
  • 登録イベント
  • ログアウトイベント
  • 標準イベントモデルのイベント伝播について:
  • 取得フェーズ:Documentオブジェクトからドキュメントツリーに沿ってターゲットノードにイベントが伝播します.ターゲットノードのいずれかの親ノードに同じイベント処理関数が登録されている場合、イベントは伝播中に最初に最上位の親ノードで実行され、次のように伝播します.
  • <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			.box{
    				width: 200px;
    				height: 200px;
    				background-color: red;
    				display: flex;
    				justify-content: center;
    				align-items: center;
    			}
    			.son{
    				width: 100px;
    				height: 100px;
    				background-color: #8A2BE2;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="box">
    			<div class="son"></div>
    		</div>
    		<script type="text/javascript">
    			let box = document.querySelector('.box');
    			let son = document.querySelector('.son');
    			box.addEventListener('click',function(){
    				console.log('father');
    			},true);
    			son.addEventListener('click',function(){
    				console.log('son');
    			},true)
    			//  son :father   son
    			//  father :father
    			//                      ,   document           
    			//                 ,         
    		</script>
    	</body>
    </html>
    
  • ターゲットフェーズ:ターゲットノードに登録されたイベント処理関数は
  • を実行する.
  • バブルフェーズ:イベントはターゲットノードから上へトリガーされ、上位ノードが同じタイプのイベントを登録すると、段階的に応答して
  • が順次上へ伝播する.
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			.box{
    				width: 200px;
    				height: 200px;
    				background-color: red;
    				display: flex;
    				justify-content: center;
    				align-items: center;
    			}
    			.son{
    				width: 100px;
    				height: 100px;
    				background-color: #8A2BE2;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="box">
    			<div class="son"></div>
    		</div>
    		<script type="text/javascript">
    			let box = document.querySelector('.box');
    			let son = document.querySelector('.son');
    			box.addEventListener('click',function(){
    				console.log('father');
    			});
    			son.addEventListener('click',function(){
    				console.log('son');
    			})
    			//   son :  son   father
    			//  father :father
    			//              ,                     ,             
    		</script>
    	</body>
    </html>
    

    2、デフォルト動作の発生を阻止する
    (1)泡立ち止め
    e.stopPropagation():eは、登録時にイベント処理関数に送信されるイベント、例えば、上記のバブルフェーズの例であり、以下の変更を行うことができる.
                box.addEventListener('click',function(e){
    				console.log('father');
    			});
    			son.addEventListener('click',function(e){
    				console.log('son');
    				e.stopPropagation();
    			})
    			//     son      son ,son       
    

    3、標準イベントモデルでよく使われるイベントタイプ(従来のイベントモードに対して標準イベントモデルのイベントタイプの前に‘on’を付ける)
    (1)常用マウスイベント
    ≪イベント|Events|ldap≫
    説明
    mouseover
    マウスの移動
    mouseout
    マウスの移動
    mouseenter
    要素にマウスを移動
    mouseleave
    要素の外側にマウスを移動
    mousemove
    マウスの移動
    click
    クリック
    doubleclick
    ダブルクリック
    mousedown
    マウスを押して離さない
    mouseup
    マウスを離す
    例1:マウスを押して画像を切り替える:
            <img src="img/10.jpg"/>
    		<script type="text/javascript">
    			let img = document.querySelector('img');
    			img.addEventListener('mousedown',function(e){
    				img.src = "img/11.jpg";
    			})
    			img.addEventListener('mouseup',function(e){
    				img.src = "img/13.jpg";
    			})
    		</script>
    

    例2:マウス移動クリアタイマー:
            <div id=""></div>
    		<script type="text/javascript">
    			let div = document.querySelector('div');
    			let count = 0;
    			let timer = null;
    			function auto(){
    				timer = setInterval(function(){
    					console.log(count += 1);
    				},2000);
    			}
    			auto();
    			div.addEventListener('mouseenter',function(e){
    				clearInterval(timer);
    			})
    			div.addEventListener('mouseout',function(e){
    				clearInterval(timer);
    				auto();
    			})
    		</script>
    

    注意:マウスが移動するターゲットにサブエレメントがある場合は、次の例のようにmouseenterとmouseleaveを使用することが望ましい.サブエレメントがない場合はmouseoverとmouseoutを使用することができる.
                //father     ,  onmouseover       ,    ,  onmouseenter      
    			//             onmouseover     
    			document.getElementsByClassName('father')[0].onmouseover = function(){
    				console.log('over');
    			}
    			document.getElementsByClassName('father')[0].onmouseenter = function(){
    				console.log('enter');
    			}
    

    (2)共通キーボードイベント
    ≪イベント|Events|ldap≫
    説明
    keyup
    キーを離す
    keydown
    キーを押す
    keypress
    中ボタンを押す
    ボタンを押す順番は以下の通りです:down/press/up、ずっと押すとdown/pressが実行されます
                document.addEventListener('keyup',function(e){
    				console.log('up');
    			});
    			document.addEventListener('keypress',function(e){
    				console.log('press');
    			});
    			document.addEventListener('keydown',function(e){
    				console.log('down');
    			});
    

    たとえば、sキー入力ボックスを押すと自動的にフォーカスします.
            <input type="text"/>
    		<script type="text/javascript">
    		    //     
    			document.addEventListener('keyup',function(e){
    				//  s        
    			    if(e.keyCode === 83){
    					let input = document.getElementsByTagName('input')[0];
    					input.focus();//  
    				}	
    			},true);
    		</script>
    

    (3)その他のイベント
    ≪イベント|Events|ldap≫
    説明
    focus
    フォーカスの取得
    blur
    焦点を失う
    input
    入力イベント
    change
    ドメインの内容が変更されました
    submit
    フォーム送信イベント
    **注:**blurを使用する前にfocusを使用するのが一般的です
    例1:入力ボックスでフォーカスを取得して内容を入力すると、pタグで入力ボックスの内容が表示される
            <div class="box">
    			<p>show</p>
    			<input type="text"/>
    		</div>
    		<script type="text/javascript">
    			let p = document.querySelector('p');
    			let input = document.querySelector('input');
    			
    			input.addEventListener('keyup',function(e){
    				p.innerHTML = input.value;
    				p.style.display = 'block';
    			});
    			
    			input.addEventListener('focus',function(e){
    				if(input.value == ''){
    					p.style.display = 'none';
    				}else{
    					p.style.display = 'block';
    				}
    			});
    			input.addEventListener('blur',function(e){
    				p.style.display = 'none';
    			});
    

    注意:
  • inputは、入力ボックスの入力時に
  • をトリガーする.
  • change入力ボックスに内容を入力後、フォーカスを失ったときにトリガーまたはリターンキーを押す
  • をトリガーする.

    三、事件依頼


    イベント依頼とは、イベントバブルの原理を利用して、イベントターゲットを設定する親ノードに直接サブノードに設定せずにイベントを設定することであり、イベントをクリックする例として、子ノードをクリックすると親ノードにバブルが発生し、間接的に設定するイベントが実行され、親ノードに多くの子ノードがある場合、将来的に効率が向上し、親ノードにイベントを設定するだけでよい.
    例:
            <ul>
    			<li>1</li>
    			<li>2</li>
    			<li>3</li>
    			<li>4</li>
    			<li>5</li>
    		</ul>
    		<script type="text/javascript">
    			let ul = document.querySelector('ul');
    			ul.addEventListener('click',function(){
    				console.log('ul-li');
    			});
    		</script>
    

    いずれかのli要素をクリックすると、「ul-li」が出力され、liをクリックすると、クリックイベントはliからulに泡が立ち、ulにイベントリスニングが設定され、親要素のクリックイベントが実行され、日常開発では、このメカニズムを利用して、イベントのバインドを減らし、ページ効率を高めることができる.
    イベント反映関数にパラメータeventを入力すると、e.targetを使用して現在のクリック要素を取得できます.
                ul.addEventListener('click',function(e){
    				console.log('ul-li');
    				console.log(e.target);
    			});