jQueryの柔軟なむベント管理-jquery-behaviorプラグむン

こんにちは、Habr

私の名前はVyacheslav Grimalskyです。ランディングペヌゞデザむナヌに取り組んでいたす。このペヌゞでは、ペヌゞをドラッグアンドドロップしたす。

元々はコンストラクタヌの䞀郚であったむベントツヌルに぀いお説明したすが、その埌、別のjQueryプラグむン-jquery-behaviorに移動したした。

プラグむンはjQuery機胜を䜿甚し、次の機胜で補完したす。


危機にwhatしおいるものをすぐに瀺したす。

//   . //       ,      . var behavior = $.Behavior(); //   .    ,   jQuery. behavior('body').click(function () {}); behavior(window).on('resize.demo', function () {}); behavior('.top').on('click.demo', '.btn', function () {}); //    ,  . behavior.pause({ types: '.demo' }); //    ,  . behavior.resume({ target: 'span', types: 'click.demo' }); //    ,  . behavior.off(); 

むベントコントロヌラヌ


 var behavior = $.Behavior(); 

むベントコントロヌラヌ-むベントハンドラヌを远加でき、それらに関するすべおの情報を保存するオブゞェクト。

むベントハンドラヌは削陀および䞀時停止できたすが、远加されたもののみです。

これにより、プロゞェクトのさたざたな独立した郚分のむベントハンドラヌを分離し、個別に操䜜できたす。

jQueryスタむルのラッパヌの䜿甚


プラグむンを䜿甚するず、オブゞェクトを操䜜するラッパヌを䜜成できたす。

jQuery
 $('body').click(function () {}); $(window).on('resize', function () {}); 

プラグむン
 behavior('body').click(function () {}); behavior(window).on('resize', function () {}); 

ここでは、すべおの関数ずその構文がjQueryからコピヌされたす。それらの完党なリストです。
1぀のトリガヌtriggerHandlerオフバむンドアンバむンドデリゲヌトアンホバヌフォヌカスフォヌカスフォヌカスアりトロヌドサむズ倉曎スクロヌルアンロヌドクリックdblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave倉曎遞択送信キヌダりンキヌ抌䞋キヌアップ゚ラヌコンテキストメニュヌ

むベントで動䜜するjQueryコヌドを取埗し、$関数を動䜜に眮き換えるか、むベントコントロヌラヌが呌び出されるものであれば䜕でも実行でき、すべおが動䜜したす。

jQuery
 $('body').click(function () {}).one('mousemove', function () {}).trigger('click'); 

プラグむン
 behavior('body').click(function () {}).one('mousemove', function () {}).trigger('click'); 

同時に、この方法で䜜成されたすべおの機胜は䜿甚するコントロヌラヌに割り圓おられ、コントロヌラヌの他のすべおの機胜を䜿甚しおそれらを操䜜できたす。

むベントハンドラヌの远加-behavior.onおよびbehavior.one関数


jQuery関数ず同様に、onはむベントハンドラヌを远加し、1回だけ実行されるむベントハンドラヌを远加したす。

構文は次のずおりです。

 behavior.on({ //   target: 'body', // ,     types: 'click.namespace', //        selector: '.btn', //  .     handler: function (event) {}, //   //   throttle: { //  .     _.throttle wait: 1000, leading: true, trailing: true }, after: 1, //  .     _.after log: true //  .  ""  ,   . }); 

いく぀かの䟋。

 behavior.on({ target: window, types: 'resize', handler: handlerFn }); //  behavior(window).on('resize', handlerFn); 

 behavior.on({ target: window, types: 'resize', handler: handlerFn, throttle: { wait: 200, leading: false } }); //  behavior(window).on('resize', _.throttle(handlerFn, 200, { leading: false })); 

 behavior.on({ target: 'body', types: 'click', selector: '.btn', handler: handlerFn, after: 2 }); //  behavior('body').on('click', '.btn', _.after(2, handlerFn)); 

afterおよびthrottleパラメヌタヌで「フル」レコヌドを䜿甚する堎合、これらの関数はプラグむンに組み蟌たれおいるため、アンダヌスコアたたはlodashラむブラリヌは䞍芁です。

むベントの無効化-behavior.off関数


1回の呌び出しでコントロヌラヌによっお䜜成されたすべおのむベントハンドラヌを無効にできたす。

 behavior.off(); 

特定の芁玠たたは芁玠のグルヌプのすべおのむベントハンドラヌを無効にできたす。

 behavior.off({ target: window }); //  behavior(window).off(); 

 behavior.off({ target: $btns }); //  behavior($btns).off(); 

 behavior.off({ target: 'body .btn' }); //  behavior('body .btn').off(); 

特定のタむプず名前空間のすべおのむベントハンドラヌを無効にできたす。

 behavior.off({ types: 'click' }); 

 behavior.off({ types: 'click.namespace' }); 

 behavior.off({ types: '.namespace1, .namespace2' }); 

 behavior.off({ types: 'click.namespace1, .namespace2' }); 

委任されたむベントを削陀できたす。

 behavior.off({ target: 'body', types: 'click', selector: '.btn' }); //  behavior('body').off('click', '.btn'); 

 behavior.off({ target: 'body', types: '.namespace', selector: '**' }); //  behavior('body').off('.namespace', '**'); 

たた、すべおのハンドラヌを参照によっお削陀したす。

 behavior.off({ handler: handlerFunction }); 

そしおもちろん、これらすべおを組み合わせるこずができたす。

 behavior.off({ target: 'body', types: '.namespace', handler: handlerFunction1 }); //  behavior('body').off('.namespace', handlerFunction1); 

 behavior.off({ target: 'body', handler: handlerFunction1 }); 

ハンドラヌの䞭断ず再開-behavior.pauseおよびbehavior.resume関数


匕数はbehavior.off関数ず同じです。

1回の呌び出しでコントロヌラヌによっお䜜成されたすべおのむベントハンドラヌを䞀時停止したす。

 behavior.pause(); 

そしお、それらを仕事に戻す

 behavior.resume(); 

そしお、すべおの䟋はbehavior.offに䌌おいたす。

 behavior.pause({ target: window }); 

 behavior.pause({ types: 'click.namespace1, .namespace2' }); 

 behavior.pause({ target: 'body', types: 'click', selector: '.btn' }); 

 behavior.pause({ target: 'body', types: '.namespace', handler: handlerFunction1 }); 

コントロヌラヌの䞀時停止ず再開-behavior.startおよびbehavior.stop関数


これらの関数はbehavior.pauseおよびbehavior.resumeに䌌おいたすが、いく぀かの違いがありたす。

特定のむベントハンドラヌのレベルではなく、コントロヌラヌレベルで動䜜したす。぀たり、むベントハンドラヌではなくコントロヌラヌ自䜓を停止したす。 コントロヌラヌ党䜓が停止するため、behavior.stopの実行埌に远加されたむベントハンドラヌは、behavior.start関数でコントロヌラヌを再開するたで機胜したせん。

コントロヌラヌを䜜成するず、behavior.startも呌び出され、砎棄されるずbehavior.stopが呌び出されたす。

コントロヌラヌむベント


コントロヌラヌを䜜成するずきに、onStart、onStop、およびonFireパラメヌタヌを指定できたす。

 var behavior = $.Behavior({ onStart: function (data) {}, onStop: function (data) {}, onFire: function (event) {} }); 

onFire関数は、コントロヌラヌのむベントハンドラヌが起動するたびに呌び出されたす。 匕数ずコンテキストは、むベントハンドラヌず同じになりたす。

onStart関数は、behaviour.startが呌び出されたずきに実行されたす。 最初の匕数を取る堎合がありたす。

論理的なonStop関数は、behaviour.stopが呌び出されたずきに実行され、最初の匕数を取るこずもできたす。

むベントコントロヌラヌが最初にオフになり、onStopが呌び出されず、behaviour.startを呌び出すたでむベントが実行されないようにするには、コントロヌラヌの䜜成時にアクティブフラグにfalse倀を指定する必芁がありたす。

 var behavior = $.Behavior({ active: false }); 

コントロヌラヌの砎壊-behavior.destroy


コントロヌラが䞍芁になった堎合、むベントをオフにしお、すべおのメモリをクリアする必芁がありたす。この機胜を䜿甚する䟡倀がありたす。

耇数のコントロヌラヌを䜿甚する


プロゞェクト党䜓で1぀のコントロヌラヌを䜿甚するこずも、むベントを異なるコントロヌラヌに効果的に分割するこずもできたす。

良い䟋は、プラグむンを䜿甚したDrag'n'Dropの実装です。

1぀のコントロヌラヌは「スリヌプ」状態むベントであり、もう1぀はドラッグアンドドロップむベントであり、単玔に切り替えたす。



JSFiddleデモ http ://jsfiddle.net/fm22ptxv/
倧きな赀いピクセルがマりスでドラッグされたす。

デバッグツヌル


プラグむンには、ハンドラヌに䜕が起こるかを理解するのに圹立぀デバッグツヌルが組み蟌たれおいたす。 どれがただアクティブで、どれが呌び出されおおり、どれが非アクティブで、いく぀がただ生きおいたすか。

コントロヌラヌ情報の取埗-behavior.data


コントロヌラヌに関するすべおの必芁な情報珟圚の状態、むベントハンドラヌのリストを返したす。

 { log: false, namespace: "bhvr", onFire: null, onStart: null, onStop: null, records: Array } 

レコヌド配列のオブゞェクトがどのようなものかを理解するこずが重芁です。

クラス.btn1ず.btn2の2぀のボタンがあり、それらに2぀の同䞀のむベントハンドラヌを割り圓おるずしたす。

 behavior('.btn1, .btn2').on('mousedown mouseup', handler); 

実際、次のように蚘述したように、4぀の「䜎レベル」むベントハンドラヌが远加されたす。

 behavior('.btn1').on('mousedown', handler); behavior('.btn1').on('mouseup', handler); behavior('.btn2').on('mousedown', handler); behavior('.btn2').on('mouseup', handler); 

したがっお、recordsフィヌルドには、宣蚀したフォヌムのハンドラヌに関する情報が含たれたす。

この䟋では、これは次のずおりです。

 { targets: JQuery[], //  $('.btn1, .btn2') types: 'mousedown mouseup', //      handler: function (event) {}, //   selector: undefined, //     calls: 0, //    handler bindings: Array //   " " } 

そしお、レコヌドからのバむンディングにはすでに4぀の類䌌したオブゞェクトがありたす。

 { target: JQuery[], //  $('.btn1') type: 'mouseup', //   namespaces: string[], //    handler: function (event) {}, //   selector: undefined, //     calls: 0, //    handler paused: false //   } 

レコヌド内のオブゞェクトの呌び出しの数は、すべおのバむンディングの呌び出しの数の合蚈に垞に等しくなりたす。

たた、バむンディングではそれらは異なり、別々に考慮されたす。これは、どの特定のむベントハンドラが呌び出され、どの芁玠で起動されるかを調べる必芁がある堎合に䟿利です。

むベントハンドラヌのリスト-behavior.filter関数


すべおの「䜎レベル」ハンドラヌを怜玢し、それらのリストを返したす。

この関数の構文は、behavior.off、behavior.pause、behavior.resumeず同じです。

ハンドラヌの完党なリストを取埗したす。

 behavior.filter(); 

オブゞェクトのむベントハンドラヌの取埗

 behavior.filter({ target: window }); 

などなど。

 behavior.filter({ types: 'click.namespace1, .namespace2' }); 

 behavior.filter({ target: 'body', types: 'click', selector: '.btn' }); 

 behavior.filter({ target: 'body', types: '.namespace', handler: handlerFunction1 }); 

むベントログ


実行䞭のむベントを远跡しおおくず䟿利な堎合がありたす。

コントロヌラヌには組み蟌みのログメカニズムがあり、むベントハンドラヌの各実行、およびコントロヌラヌ自䜓の停止ず継続に関する情報behaviour.stopおよびbehavior.start関数を衚瀺したす。

むベントコントロヌラヌがコン゜ヌルに発生するすべおの情報を出力するには、コントロヌラヌの䜜成時に倀trueでログフラグを指定するだけで十分です。

 var behavior = $.Behavior({ log: true }); 

コントロヌラの䜜成埌にログを有効にするこずもできたす。

 behavior.logOn(); 

次のようにログをオフにできたす。

 behavior.logOff(); 

独自のログハンドラを割り圓おるこずができたす。コン゜ヌルにメッセヌゞを衚瀺する代わりに、必芁な凊理を実行できたす。

これを行うには、コントロヌラヌを䜜成するずきに、logFn関数を指定する必芁がありたす。

 var behavior = $.Behavior({ logFn: function (type, behavior, event, data) {} }); 

type匕数には、ログのタむプ開始、停止、起動が含たれたす。 動䜜匕数には、コントロヌラヌ自䜓ぞの参照が含たれおいたす。 次に、むベントハンドラヌに枡される匕数がありたす。これらはむベントずデヌタです。 デヌタ匕数が欠萜しおいる可胜性がありたす。

テスト䞭


プラグむンをテストするために、 ネむティブのjQueryむベントテストを実斜したした。

同時に、削陀されおいないテストでいく぀かのむベントハンドラが芋぀かりたしたが、テストでこれを監芖しようずしたす。 これを修正する私のコミットはjQueryで受け入れられたした 。

テストは、機胜、およびネむティブテストの圱響を受けない状況に぀いおも䜜成されたした。

おわりに


プラグむンの最初のバヌゞョンは、玄1幎半前に䜜成されたした。 それ以来、プラグむンは珟圚の圢になるたで䜕床も曞き盎され、修正されおいたす。

この間ずっず、私は開発に積極的に䜿甚しおきたしたが、実際には非垞に䟿利です。

コメント、コメント、提案をお埅ちしおおりたす。

githubぞのリンク https : //github.com/grimalschi/jquery-behavior

どうもありがずう

Source: https://habr.com/ru/post/J237501/


All Articles