自己カプセル化された JavaScript イベント キュー関数 version_javascript スキル
背景
addEventListener() またはattachEvent() を使用して JavaScript でイベントをバインドする場合、いくつかの小さな問題があります。
1. addEventListener() またはattachEvent() を使用して追加された匿名関数は削除できません。
oBtn.addEventListener('click',function(){
alert('ボタンがクリックされました')
},false)
oBtn.reomveEventListener('click', function() {
alert('button is clicked')
},false)
//匿名関数が
に渡されるため、oBtn のイベントを削除できません 2. ie6 - IE8 では、attachEvent() を使用して複数のイベントをバインドすると、逆順序で実行される問題があります。
var oBtn = document.getElementById('btn ');
oBtn.attachEvent('onclick',function(){
alert(1)
})
oBtn.attachEvent('onclick',function() {
アラート(2)
})
oBtn.attachEvent('onclick',function(){
アラート(3)
})
//ie9 次へ実行順序 1 , 2, 3
//ie6-ie8 での実行順序 3, 2, 1
問題を解決してください
将来再利用できるように、クロスブラウザーのイベント バインディング モジュールを作成したいと考えています。同時に、アピールの問題も解決したいと考えています。 JQuery は内部でイベント キューとデータ キャッシュ メカニズムを使用してこの問題を解決しています。関連するソース コードを調べたところ、それが非常に複雑であることがわかり、自分でいくつかの方法を試し、なんとか解決できました。私が投稿したコード スニペットは、もともとオブジェクト指向で書かれていたので、複雑にしたくなかったので、関数に変更しました。
/*イベントをバインディングするためのインターフェース
*
*@param {dom-DOM}、{type-string}、および {fn-function} のオプションのパラメーター {fnName-string}
* @execute イベント キューを作成し、DOM オブジェクト属性に追加します
イベント ハンドラー (関数) をイベント キューに追加します
イベント ハンドラーに識別子を追加して、指定したイベント ハンドラーを削除できます
*/
function binding(dom,type,fn,fnName){
dom.eventQueue = dom.eventQueue ||
dom.eventQueue[type] = dom.eventQueue[type] | {};
dom.handler = dom.handler || {};
if (!fnName) {
varindex = queueLength(dom,type);
dom.eventQueue [ type]['fnQueue' インデックス] = fn;
}
else {
dom.eventQueue[type][fnName] = fn;
};
if (! dom .handler[type]) bindingEvent(dom,type);
};
/*バインドイベント
*
*@param {dom-DOM} および {type-string }
*@execute イベントを 1 回だけバインドします。ハンドラーは実行イベント キュー内のイベント ハンドラー (関数) を走査するために使用されます
*@caller binding()
*/
function bindingEvent(dom, type ){
dom.handler[type] = function(){
for(var guid in dom.eventQueue[type]){
dom.eventQueue[type][guid].call(dom) ;
}
};
if (window.addEventListener) {
dom.addEventListener(type,dom.handler[type],false);
}
else {
dom.attachEvent('on' type,dom.handler[type]);
};
};
/*イベントを削除するためのインターフェース
*
* @param {dom-DOM} および {type-string} のオプションパラメータ {fnName-function}
*@execute 識別子がない場合は unBindEvent() を実行
識別子がある場合は指定されたイベント ハンドラを削除、イベントキューの長さが 0 の場合、unBindEvent()
*/
function unBind(dom,type,fnName){
var hasQueue = dom.eventQueue && dom.eventQueue[type]; を実行します。 > if (!hasQueue) return;
if (!fnName) {
unBindEvent(dom,type)
}
else {
delete dom.eventQueue[type][fnName] ;
if (queueLength(dom,type) == 0) unBindEvent(dom,type);
} > *@param {dom-DOM} および {type-string}
*@execute バインドを削除しますイベント ハンドラー handler を実行し、イベント キューをクリアします
*@caller unBind()
*/
function unBindEvent(dom,type){
if (window.removeEventListener) {
dom.removeEventListener( type,dom.handler[type])
}
else {
dom.detachEvent(type,dom.handler[type])
}
delete dom.eventQueue[type] ];
};
/*イベントキューの長さを判断します
*
*@param {dom-DOM} および {type-string}
*@caller binding() unBind ()
*/
function queueLength(dom,type){
var インデックス = 0;
for (dom.eventQueue[type] の var length){
インデックス ;
}
インデックスを返します;
};
使用方法
コードをコピー
var oBtn = document.getElementById('btn');
//イベントのバインド
//ボタンの 3 つのクリック イベント関数を同時にバインドします
//ie6 - 実行順序は、ie8
bind(oBtn,'click',function(){
alert(1);
})
bind(oBtn,'click',function() では変更されません。 {
アラート(2);
},'myFn')
bind(oBtn,'click',function(){
アラート(3);
})
//イベントを削除
//すべてのバインドされたクリック イベント関数を削除し、匿名関数の削除をサポートします
unBind(oBtn,'click')
//識別子のみを削除 myfn のイベント関数の場合
unBind(oBtn,'click','myFn')
プログラミングのアイデア
プログラムの主なアイデアは、イベント キューを dom 要素オブジェクトの属性として使用し、グローバル環境を汚染することなく dom 要素に追加することです。これにより、複数のイベント関数のデータをバインドする問題を解決できます。さまざまなイベント タイプとさまざまな dom 要素の関係。
//dom 要素のイベント キュー
dom {
eventQueue : {
'クリック' : {
fnQueue1 : function,
myfn : function,
fnQueue3 : function
}
'mouseover' : {
fnQueue1 : 関数,
fnQueue2 : 関数
}
}
}
イベント関数は毎回、対応するイベント タイプのイベント キューに追加され、イベントは 1 回だけバインドされます。イベントがトリガーされると、ハンドラー イベント関数が実行され、ハンドラーはイベント キュー内のイベント関数をたどって実行します。
unBind() は、識別子が渡されない場合はバインドされたすべてのイベント関数を削除し、匿名関数の削除をサポートし、識別子がある場合は指定されたイベント関数を削除します。
プログラムのロジックは複雑ではありません。バグやパフォーマンスの問題がある可能性があります。興味があれば、ガイダンスとコミュニケーションを提供できます。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが
