1

jQuery プラグインを作成していて、プラグインのイベントを本体にバインドし、特定の子要素にデリゲートするという興味深い問題に遭遇しました。

これは問題ありませんでしたが、プラグインは同じページで複数のインスタンスをサポートするように構築されているため、プラグインがページに存在する回数だけイベントが発生します。(何度も縛られている)

ウィンドウに関連付けられているブール値フラグ以外に、プラグイン コード内から一度だけバインドする方法はありますか?

プラグインコードの外側にバインドして1回だけバインドするか、タイマーを1回だけ設定することで問題を解決できますが、イベントが20回発生しないようにしたいと思います。他に方法があればもっと探します..

考えられる解決策

if (!window.tip.hoverIntent || window.tip.hoverIntent === undefined) {
    //bind handler..
    window.tip.hoverIntent = true;
}

イベントハンドラ

$('body').on({
    mouseenter: function() {
        clearTimeout(window.tip.timerID);
    },
    mouseleave: function() {
        window.tip.timerID = setTimeout(function() {
            $('.tip-shown').remove();
        }, 250);
    }
}, '.tip-shown');
4

2 に答える 2

1

プラグイン関数の外でフラグを使用できます

var first_time = true;
$.fn.my_plugin = function() {
    if (first_time) {
        first_time = false;
        $('body').on({
            mouseenter: function() {
                clearTimeout(window.tip.timerID);
            },
            mouseleave: function() {
                window.tip.timerID = setTimeout(function() {
                    $('.tip-shown').remove();
                }, 250);
            }
        }, '.tip-shown');

    }
};
于 2014-04-11T14:00:44.330 に答える
0

ハンドラーが既に呼び出されているかどうかを評価してから中断することができます。次のように:

function eventHandler(e)
{
  if(e.handled !== true)
  {
    e.handled = true;
  }
  return false;
}

これにより、イベントが 1 回だけ発生するはずです。

于 2012-10-10T06:46:23.163 に答える