ホームページ  >  記事  >  ウェブフロントエンド  >  イベントハンドルのバインディングリスニング関数例のJavaScript実装の詳細な説明

イベントハンドルのバインディングリスニング関数例のJavaScript実装の詳細な説明

小云云
小云云オリジナル
2018-01-19 10:47:131810ブラウズ

この記事では、JavaScript でリスニング関数をイベント ハンドラーにバインドする方法を主に紹介し、JavaScript イベント バインディングの一般的なテクニックと注意事項をサンプル形式で分析します。

JavaScript でイベント リスニング関数を Dom 要素にバインドすることは非常に一般的なことですが、ここには多くのバグもあります。さまざまなブラウザーがイベント バインディングの多くのメソッドを提供していますが、信頼できるのは 3 つだけです:

1. 従来のバインディング メソッド:


elem.onclick = function( event ){
  alert(event.type + 'this.innerHTML');
};

a。関数本体のこれもポイントしています。イベントを処理しているノード (現在イベント ハンドラーを実行しているノードなど)。

b. 要素のイベント ハンドラーは 1 つの関数のみを登録できます。繰り返し登録すると、上書きが発生します。また、従来のバインド方法はイベント バブリングでのみ実行されます。

2. W3C 標準バインディング メソッド:


var elem = document.getElementById('ID');
elem.addEventListener('click' ,
          function( event ){
            alert(event.type + ' ' + this.innerHTML + 1);
          } ,
          false  //冒泡阶段执行
);
elem.addEventListener('click' ,
          function( event ){
            alert(event.type + ' ' + this.innerHTML + 2);
          } ,
          false
);

a。このバインディング メソッドは、同じ要素の同じイベント ハンドラーで複数のリスニング関数を登録できます。 listen 関数は現在の要素を指します。

b. ただし、一般的な IE ブラウザはこの登録方法をサポートしていません。

3. IE イベント ハンドラー登録メソッド:


var elem = document.getElementById('a');
elem.attachEvent('onclick' ,
  function(){
    alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 1);
  }
);
elem.attachEvent('onclick' ,
  function(){
    alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 2);
  }
);

a。このバインディング メソッドは、同じイベント ハンドラーを複数回登録できます。

b. IE のイベント モデルはイベント キャプチャをサポートしていません。リスニング関数本体の this は現在の要素を指しておらず、IE の window.event.srcElement は現在のノードではなくイベントが発生するノードを指しています。イベント オブジェクト には同等の DOM currentTarget プロパティはありません。

4. クロスブラウザーメソッド 1:


function addEvent(element, type, handler) {
 if (!handler.guid)handler.guid = addEvent.guid++;
 if (!element.events) element.events = {};
 var handlers = element.events[type];
 if (!handlers) {
  handlers = element.events[type] = {};
  if (element["on" + type]) {
   handlers[0] = element["on" + type];
  }
 }
 handlers[handler.$$guid] = handler;
 element["on" + type] = handleEvent;
};
addEvent.guid = 1;
function removeEvent(element, type, handler) {
 if (element.events && element.events[type]) {
  delete element.events[type][handler.$$guid];
 }
};
function handleEvent(event) {
 var returnValue = true;
 event = event || fixEvent(window.event);
 var handlers = this.events[event.type];
 for (var i in handlers) {
  this.$$handleEvent = handlers[i];
  if (this.$$handleEvent(event) === false) {
   returnValue = false;
  }
 }
 return returnValue;
};
function fixEvent(event) {
 event.preventDefault = fixEvent.preventDefault;
 event.stopPropagation = fixEvent.stopPropagation;
 return event;
};
fixEvent.preventDefault = function() {
 this.returnValue = false;
};
fixEvent.stopPropagation = function() {
 this.cancelBubble = true;
};

上記のコードは Dean EdwardsaddEvent/removeEven

5. クロスブラウザーメソッド 2:


function addEvent( obj, type, fn ) {
 if ( obj.attachEvent ) {
  obj['e'+type+fn] = fn;
  obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
  obj.attachEvent( 'on'+type, obj[type+fn] );
 } else
  obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
 if ( obj.detachEvent ) {
  obj.detachEvent( 'on'+type, obj[type+fn] );
  obj[type+fn] = null;
 } else
  obj.removeEventListener( type, fn, false );
}

、イベントフローは、バブリング イベントとキャプチャ イベントに分類できます。ほとんどの HTML 要素には、ハイパーリンク、送信ボタンなどの独自のデフォルト動作が含まれています。バインディング イベントに「return false」を追加することで、デフォルトの動作を防ぐことができます。ピンインに興味がある場合は、この Web サイトの JS でのイベント バブリングとイベント キャプチャの詳細な紹介に関する関連の紹介を参照してください。

関連する推奨事項:

vue はスクロール イベントを監視し、要素の天井または固定位置表示の詳細な説明

ページ スクロール イベントを監視する ReactJS の実装方法

イベントの使用例の詳細な説明Node.js でのモニタリングとイベント発行

以上がイベントハンドルのバインディングリスニング関数例のJavaScript実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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