イベントハンドルのJavaScriptバインディングリスニング関数を実装する方法

小云云
リリース: 2017-12-21 10:14:56
オリジナル
1423 人が閲覧しました

JavaScript でイベント リスニング関数を Dom 要素にバインドすることは非常に一般的なことですが、ここには多くのバグもあります。さまざまなブラウザーがイベント バインディングの多くのメソッドを提供していますが、信頼できるのは 3 つだけです。この記事では、主に JavaScript でリスニング関数をイベント ハンドラーにバインドする方法を紹介し、JavaScript イベント バインディングの一般的なテクニックとメソッドを例の形式で分析します。困っている友達が参考になれば幸いです。

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 でのイベント バブリングとイベント キャプチャの詳細な紹介に関する関連の紹介を参照してください。

関連する推奨事項:

HTML5 でのオーディオおよびビデオリスナーアプリケーションの例の詳細な説明

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

javascript イベントモデル、オブジェクト、モニタリング、配信 コード例の詳しい説明

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート