0

jstree と Backbone.View.delegateEvents() にバインドされた JQuery 要素のクリック イベントを一時的に無効にしたいと考えています。

以下は、私が行う処理方法です

イベントを無効にする前に、次を使用してイベントをローカル変数に記録します

self.defaultClick = $(this).data('events').click[0];

その後、使用してクリックイベントを無効にします

$(this).click(false);

再びバインドする必要があるので、次を使用して要素に割り当てます。

$(this).data('events').click = self.defaultClick;

2回目まではうまくいきます。

JQuery.event.add 'Object # has no method 'push'' at this line からこのエラーが発生します

handlers.push( handleObj );

問題は、最初の割り当てでは配列であるのに対し、2 回目の割り当ての後に「handlers」がイベント自体になることです。

どうすれば回避できますか?イベントが既にバインドされていることを確認した後にイベントを再割り当てしないようにするか、別の方法でイベントを割り当てることができますか?

ご協力ありがとうございました。

編集

このアプリケーションでは jstree を使用しています。css クラスに特定のイベントをバインドしましたが、アプリケーションの状態に関しては、すべてのツリー (以前にバインドされたクラスを含む) を無効にできる必要があります。

4

2 に答える 2

1

イベントが実行されるかどうかを制御するために、いくつかの変数を維持してみませんか? 次のようなもの:

var runEventFor = {};

runEventFor[ "myComponent" ] = true;
$( "#myComponent" ).click(function(evt){
    if ( runEventFor[ $(this).attr("id") ] ) {
        // code to run...
    }
});

イベントを実行したくない場合は、runEventFor[ "myComponent" ]false に設定してください。あなたの場合、このアプローチはイベントのバインド/バインド解除よりも簡単だと思います。

于 2012-08-06T03:35:52.993 に答える
1

ハンドラーのバインド/バインド解除はコストがかかります。特定のクラス名 (例: ) に対して実行するように設定された委任されたイベント ハンドラーを使用しない理由.executeState- クラスを切り替えるだけで、コードを実行するかどうかを制御できます。$(element).toggleClass('executeState');

このようにして、単一のハンドラーのみが、document(または対象とする要素の任意の親要素) に一度だけバインドされます。

$(document).on('click', '.executeState', function() {
    // handler for click event
});
于 2012-08-06T03:39:28.870 に答える