3

現在、キャッシュされた変数があり、さまざまなタイプの動作トリガーに応答するために$this適用しています。.on

$this.on('click','.trigger a',rowTrigger);
$this.on('click','.actions nav a',rowAction);

jQuery .on Documentationには、上記の2つを1つの呼び出しに組み合わせる方法があるかどうかについては触れられていません。たとえば、次のようなものがいいかもしれません。

$this.onAny({
    click: [
        {'.trigger a':rowTrigger},
        {'.actions nav a':rowAction}
    ]
});

この種のステートメントを実現する方法はありますか(たとえば、拡張する既存のプラグイン.on)?

アップデート

ユースケース(現在のコードでは、優れたソリューションの前):

// Plugin 1:
function addTriggers(){
  $this.find('td:last').append('<span class="trigger"><a href="#"></a></span>');
  return {selector:'.trigger a', event:'click', target: $this, callback: rowTrigger};
}

// Plugin 2:
function addInlineNavigation(){
  $navCode = '...'
  $this.find('td:last').append('<div class="actions">'+$navCode.html()+'</div>');
  return {selector:'.actions nav a', event:'click', target: $this, callback: rowAction};
}
4

1 に答える 1

7

この種のステートメントを実現する方法はありますか(たとえば、拡張する既存のプラグイン.on)?

私は1つを知りません。書くのはほとんど簡単でしょう。ただし、連鎖と比較して、あまり利点はありません。

$this.on('click','.trigger a',rowTrigger)
     .on('click','.actions nav a',rowAction);

しかし、繰り返しになりますが、プラグインは複雑ではありません。これがテストされていないラフドラフトです:

jQuery.fn.onAny = function(options) {
    var eventName, eventSpec, eventEntry, selector, i;

    for (eventName in options) {
        eventSpec = options[eventName];
        if (jQuery.isArray(eventSpec)) {
            // Your example, where each event name has an array of objects
            // keyed by selector, where the value is the handler
            for (i = 0; i < eventSpec.length; ++i) {
                eventEntry = eventSpec[i];
                for (selector in eventEntry) {
                    this.on(eventName, selector, eventEntry[selector]);
                }
            }
        }
        else {
            // Assuming just a straight handler here
            this.on(eventName, eventSpec);
        }
    }

    return this;
};
于 2013-03-25T10:11:37.780 に答える