3

プラグインが破棄されたときにプラグインをクリーンアップする方法について、設計上のアドバイスが必要です。

blurウィンドウでイベントをリッスンしていますが、プラグインが破棄されたときにそれらのイベントを削除する方法がわかりません。プラグインが複数の要素に適用され、1 つの要素に対してのみ破棄された場合でも、他の要素に対しては機能するはずです。これを設計する正しい方法は何でしょうか?

(function( $ ) {

    var methods = 
    {
        init : function( options ) {
            var that = this;

            $(window).blur( function( e ) {
                that.css( "color", "red" );
                console.log( "still here" );
            });
        },

        destroy : function( ) {
            console.log( "hmmm, got to take out that blur" );
        }
    };

    $.fn.pleaseKillMe = function( method )
    {
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        }
        else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        }
        else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.p5shrinkwrap' );
        }
    };

})( jQuery );
4

3 に答える 3

6

あなたの質問は、イベントハンドラー関数をバインドするときに使用するよりも、と.on()を使用する方が良い理由を示しています。ちなみに、を使用する場合、一意のイベントハンドラーのバインドを解除することはできません。.off().blur().blur()

使用できるものは次のとおりです。

$(window).on('blur.handlerID', function() {
    //do something event handling
});

$(window).off('blur.handlerID');

handlerIDイベントハンドラを一意に識別するリテラル文字列はどこにありますか。

jQuery .off()ドキュメント

于 2013-01-25T22:00:38.707 に答える
3

私が開発したフレームワークにも似たようなものがあります。スクリーンセーバーの一部のイベント処理を削除していたことを除いて。とにかく、ポイントに戻ります。次のように、イベントに名前を付ける必要があります(これが私が行ったことです)。

$(window).bind("blur.SomeIdentifier", function () {//pre 1.7
$(window).on("blur.SomeIdentifier", function () {//1.7+
 //....
});

そして今、後で、destroyでその正確なイベントを削除することができます:

$(window).unbind("blur.SomeIdentifier");//pre 1.7
$(window).off("blur.SomeIdentifier");//1.7+
于 2013-01-25T22:01:43.427 に答える
0

を使用し$(window).off('click.yourAppName', method);ます。off メソッドを有効にするには、リスナーに on メソッドを割り当てておく必要があります。そこにある .yourAppName には名前空間があり、on の呼び出しと同じである必要があります。これは、プラグイン イベントが同じアプリ内の他のイベントに干渉しないようにするためです。

于 2013-01-25T22:02:51.197 に答える