検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptでのカスタムイベントの書き方を詳しく解説_基礎知識

イベントをカスタマイズして、より柔軟な開発を実現できます。イベントは、適切に使用すると非常に強力なツールになります。イベントベースの開発には多くの利点があります (後述)。

カスタム イベントに関連する関数は、event、customevent、およびdispatcheventです。

イベントを直接カスタマイズするには、event コンストラクターを使用します。

var event = new event('build');

// listen for the event.
elem.addeventlistener('build', function (e) { ... }, false);

// dispatch the event.
elem.dispatchevent(event);

customevent は、より高度にカスタマイズされたイベントを作成でき、いくつかのデータを添付することもできます。具体的な使用方法は次のとおりです。

var myevent = new customevent(eventname, options);

オプションは次のとおりです:

{
  detail: {
    ...
  },
  bubbles: true,
  cancelable: false
}

detail はいくつかの初期化情報を保存し、トリガーされたときに呼び出すことができます。他のプロパティは、イベントにバブリング機能があるかどうかなどを定義します。

組み込みイベントは特定の操作に基づいてブラウザによってトリガーされますが、カスタム イベントは手動でトリガーする必要があります。 dispatchevent 関数は、イベントをトリガーするために使用されます。

element.dispatchevent(customevent);

上記のコードは、customevent イベントが要素でトリガーされることを示しています。組み合わせて使用​​します:

// add an appropriate event listener
obj.addeventlistener("cat", function(e) { process(e.detail) });

// create and dispatch the event
var event = new customevent("cat", {"detail":{"hazcheeseburger":true}});
obj.dispatchevent(event);

カスタム イベントを使用するには互換性の問題に注意する必要がありますが、jquery を使用するとはるかに簡単です。

// 绑定自定义事件
$(element).on('mycustomevent', function(){});

// 触发事件
$(element).trigger('mycustomevent');
此外,你还可以在触发自定义事件时传递更多参数信息:

$( "p" ).on( "mycustomevent", function( event, myname ) {
 $( this ).text( myname + ", hi there!" );
});
$( "button" ).click(function () {
 $( "p" ).trigger( "mycustomevent", [ "john" ] );
});

javascript カスタム イベントは、クリックや送信などの標準イベントとは異なる自己カスタマイズされたイベントです。カスタム イベントの利点を説明する前に、カスタム イベントの例を見てみましょう。

<div id="testbox"></div>

// 创建事件
var evt = document.createevent('event');
// 定义事件类型
evt.initevent('customevent', true, true);
// 在元素上监听事件
var obj = document.getelementbyid('testbox');
obj.addeventlistener('customevent', function(){
  console.log('customevent 事件触发了');
}, false);

特定の効果については、デモを表示できます。コンソールで obj.dispatchevent(evt) と入力します。コンソールに「customevent イベントがトリガーされました」という出力が表示され、カスタム イベントが正常にトリガーされたことがわかります。

このプロセスでは、createevent メソッドは空のイベント evt を作成し、initevent メソッドを使用してイベント タイプを合意されたカスタム イベントとして定義し、対応する要素を監視してから、dispatchevent を使用してイベントをトリガーします。

はい、カスタム イベントのメカニズムは通常のイベントのメカニズムと同じです。イベントをリッスンし、コールバック操作を記述し、イベントがトリガーされた後にコールバックを実行します。ただし、違いは、カスタム イベントがトリガーされたときに、カスタム イベントが完全に制御されることです。これは、一種の javascript 分離が達成されることを意味します。カスタム イベント メカニズムを使用して、関連する複数の論理的に複雑な操作を柔軟に制御できます。

もちろん、ご想像のとおり、上記のコードは以前のバージョンの ie では機能しません。実際、createevent() は ie8 およびそれ以前のバージョンの ie ではサポートされていませんが、ie のプライベート fireevent() は存在します。ただし、残念ながら、fireevent は標準イベントのトリガーのみをサポートします。したがって、カスタム イベントをトリガーするには、特別で簡単な方法しか使用できません。

// type 为自定义事件,如 type = 'customevent',callback 为开发者实际定义的回调函数
obj[type] = 0;
obj[type]++;
 
obj.attachevent('onpropertychange', function(event){
  if( event.propertyname == type ){
    callback.call(obj);
  }
});

このメソッドの原理は、実際にはカスタム属性を dom に追加し、同時に要素の propertychange イベントをリッスンすることです。dom のプロパティの値が変更されると、propertychange コールバックがトリガーされます。変更された属性がカスタム属性かどうか、カスタム属性であれば開発者が実際に定義したコールバックが実行されます。これはカスタム イベントのメカニズムをシミュレートします。

カスタム イベント メカニズムを標準イベントの監視およびシミュレーション トリガーと連携させるために、完全なイベント メカニズムをここに示します。このメカニズムは、標準イベントとカスタム イベントの監視、監視の削除、およびシミュレーション トリガー操作をサポートします。コードのロジックを明確にするために、カスタム イベントには「custom」という接頭辞が付けられることに注意してください (例:customtest、customalert)。

/**
 * @description 包含事件监听、移除和模拟事件触发的事件机制,支持链式调用
 *
 */
 
(function( window, undefined ){
 
var Ev = window.Ev = window.$ = function(element){
 
  return new Ev.fn.init(element);
};
 
// Ev 对象构建
 
Ev.fn = Ev.prototype = {
 
  init: function(element){
 
    this.element = (element && element.nodeType == 1)? element: document;
  },
 
  /**
   * 添加事件监听
   * 
   * @param {String} type 监听的事件类型
   * @param {Function} callback 回调函数
   */
 
  add: function(type, callback){
 
    var _that = this;
     
    if(_that.element.addEventListener){
       
      /**
       * @supported For Modern Browers and IE9+
       */
       
      _that.element.addEventListener(type, callback, false);
       
    } else if(_that.element.attachEvent){
       
      /**
       * @supported For IE5+
       */
 
      // 自定义事件处理
      if( type.indexOf('custom') != -1 ){
 
        if( isNaN( _that.element[type] ) ){
 
          _that.element[type] = 0;
 
        } 
 
        var fnEv = function(event){
 
          event = event ? event : window.event
           
          if( event.propertyName == type ){
            callback.call(_that.element);
          }
        };
 
        _that.element.attachEvent('onpropertychange', fnEv);
 
        // 在元素上存储绑定的 propertychange 的回调,方便移除事件绑定
        if( !_that.element['callback' + callback] ){
     
          _that.element['callback' + callback] = fnEv;
 
        }
    
      // 标准事件处理
      } else {
    
        _that.element.attachEvent('on' + type, callback);
      }
       
    } else {
       
      /**
       * @supported For Others
       */
       
      _that.element['on' + type] = callback;
 
    }
 
    return _that;
  },
 
  /**
   * 移除事件监听
   * 
   * @param {String} type 监听的事件类型
   * @param {Function} callback 回调函数
   */
   
  remove: function(type, callback){
 
    var _that = this;
     
    if(_that.element.removeEventListener){
       
      /**
       * @supported For Modern Browers and IE9+
       */
       
      _that.element.removeEventListener(type, callback, false);
       
    } else if(_that.element.detachEvent){
       
      /**
       * @supported For IE5+
       */
       
      // 自定义事件处理
      if( type.indexOf('custom') != -1 ){
 
        // 移除对相应的自定义属性的监听
        _that.element.detachEvent('onpropertychange', _that.element['callback' + callback]);
 
        // 删除储存在 DOM 上的自定义事件的回调
        _that.element['callback' + callback] = null;
      
      // 标准事件的处理
      } else {
      
        _that.element.detachEvent('on' + type, callback);
      
      }
 
    } else {
       
      /**
       * @supported For Others
       */
       
      _that.element['on' + type] = null;
       
    }
 
    return _that;
 
  },
   
  /**
   * 模拟触发事件
   * @param {String} type 模拟触发事件的事件类型
   * @return {Object} 返回当前的 Kjs 对象
   */
   
  trigger: function(type){
 
    var _that = this;
     
    try {
        // 现代浏览器
      if(_that.element.dispatchEvent){
        // 创建事件
        var evt = document.createEvent('Event');
        // 定义事件的类型
        evt.initEvent(type, true, true);
        // 触发事件
        _that.element.dispatchEvent(evt);
      // IE
      } else if(_that.element.fireEvent){
         
        if( type.indexOf('custom') != -1 ){
 
          _that.element[type]++;
 
        } else {
 
          _that.element.fireEvent('on' + type);
        }
    
      }
 
    } catch(e){
 
    };
 
    return _that;
       
  }
}
 
Ev.fn.init.prototype = Ev.fn;
 
})( window );
测试用例1(自定义事件测试)

// 测试用例1(自定义事件测试)
// 引入事件机制
// ...
// 捕捉 DOM
var testBox = document.getElementById('testbox');
// 回调函数1
function triggerEvent(){
    console.log('触发了一次自定义事件 customConsole');
}
// 回调函数2
function triggerAgain(){
    console.log('再一次触发了自定义事件 customConsole');
}
// 封装
testBox = $(testBox);
// 同时绑定两个回调函数,支持链式调用
testBox.add('customConsole', triggerEvent).add('customConsole', triggerAgain);

完全なコードは、デモにあります。

デモを開いた後、コンソールで testbox.trigger('customconsole') を呼び出して、カスタム イベントを自分でトリガーします。コンソールに 2 つのプロンプトが出力されることがわかります。次に、testbox.remove('customconsole',triggeragain) と入力して、ペアを削除します。後者のリスナーについては、testbox.trigger('customconsole') を使用してカスタム イベントをトリガーします。コンソールはプロンプトのみを出力することがわかります。つまり、最後のリスナーは正常に削除されています。この時点で、すべてイベントメカニズムの機能は正常に動作しています。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。