2012-04-27 6 views
2

以下のコードを使用してスライドメニューを作成します。私は、クリックイベントにアタッチされた関数をアンバインドし、別の時間に再アタッチする方法を知る必要があります。jQueryは、イベント機能をクリックして解除し、状況に応じて再接続します。

$(document).ready(function(){ 
    $('.section').hide(); 
    $('.header').click(function(){ 
     if($(this).next('.section').is(':visible')) 
     { 
     $('.section:visible').slideUp()    
     $('.arrows:visible').attr("src","right.gif") 
     } 
     else 
     { 
     $('.section').slideUp(); 
     $(this).next('.section').slideToggle(); 
     $(this).find('.arrows').attr("src","down.gif") 
    }); 
}); 

(jQueryの1.7.2を使用して)次のコードは、私がこれまで

+0

したがって、formVersionの値に基づいて、 '$( '。header')'のクリックイベントハンドラをオンまたはオフにするだけです。 – Tejs

+0

いいえ、最初のコードブロックのクリック機能を参照して再接続するにはどうすればいいですか? –

+0

[jQueryのクリックハンドラを一時的に無効にする方法?](http://stackoverflow.com/questions/1263042/how-to-temporarily-disable-a-click-handler-in-jquery) – fcalderan

答えて

7

単に名前付き関数を作成します。ここではローテクに戻り、基本に戻って特定のイベントのバインドを解除して再接続することができます。

function doStuff() 
{ 
    if($(this).,next('.section').is(':visible')) 
     ... 
} 

$('.header').on('click', doStuff); 
$('.header').off('click', doStuff); 
+0

くそ、30秒で私を打ち負かすXD – DangerMonkey

+0

それはとても面白くなくても簡単です。ありがとうTejs –

+0

fnの名前を使用せずに最後にバインドされた関数のハンドルを取得できるのは良いことです。 'elem.on( 'click'、myfn)'のように。それから、まったく無関係のどこかで、 'var fn = elem.lastClickHandler()'、 'elem.off( 'click'、fn)'、 '//ハンドラなしのコード'、 'elem.on ' fn) ' –

2

代わりのアンバインドと再バインド

$('#printVers').click(function(){ 
    if($('#formVersion').val() != "Print") 
    { 
    $('.header').unbind('click'); 
    } 
    else 
    { 
    //else re-attach functionality? 
    } 
}); 

おかげで、私はあなたが簡単なを追加することを提案したものですクラスを.headerに設定し、クリックハンドラでクラスを確認します。任意の関数をバインド/あなたがアンバインドし、バインドを持つことを主張した場合、その後、あなたが関数にハンドラを移動し、アンバインドすることができます

$('.header').click(function(){ 
    if ($(this).hasClass('dontClick')) { 
     return false; 
    } 
    //rest of your code 

に、

$('#printVers').click(function(){ 
    if($('#formVersion').val() != "Print") 
    { 
    $('.header').addClass('dontClick'); 
    } else { 
    $('.header').removeClass('dontClick'); 
    } 
}); 

そして、あなたの.headerクリックハンドラでは、以下を参照してください時間数..

+0

もう一度、 –

+0

@MarkWaltersイベントハンドラのバインド/バインド解除は、単にクラスを追加したり削除したりするよりも多くの作業ですが、これは一般的な手法ですが、どの方法を選択するかはあなた次第です –

+0

Tjesは '.on()'と '.off()'をどのように使用し、関数に多くの面倒な名前を付けるのでしょうか?私は両方のアイデアが好きで、私はあなたの答えをアップアップしました!:) –

0

トップセクションを関数にしてから、else文で呼び出すのはなぜでしょうか?

-2

あなたは、分離機能に.click

function headerClick(){ 
    if($(this).next('.section').is(':visible')) 
    { 
    $('.section:visible').slideUp()    
    $('.arrows:visible').attr("src","right.gif") 
    } 
    else 
    { 
    $('.section').slideUp(); 
    $(this).next('.section').slideToggle(); 
    $(this).find('.arrows').attr("src","down.gif") 
    } 
} 

をすべてのコードを配置し、このようにそれをバインドすることができます:

$(document).ready(function(){ 
    $('.section').hide(); 
    $('.header').click(headerClick); 
}); 

$('#printVers').click(function(){ 
    if($('#formVersion').val() != "Print") 
    { 
     $('.header').unbind('click'); 
    } 
    else 
    { 
     $('.header').click(headerClick); 
    } 
}); 
+0

'unbind'関数は、jqueryの 'bind'メソッドを使用してバインドされている関数のみをバインド解除します。 – Foreever

1

あなたはこのような何かを試すことができます。

$('#printVers').click(function(){ 
    if($('#formVersion').val() != "Print") 
    { 
     $('.header').addClass('clickDisabled'); 
    } 
    else 
    { 
     $('.header').removeClass('clickDisabled'); 
    } 
}); 

このクラスのクリックハンドラチェックでは、

$(document).ready(function(){ 
    $('.section').hide(); 
    $('.header').click(function(){ 
     if(!$(this).hasClass('clickDisabled')){ 
      ... 
      ... 
     } 
    }); 
}); 
+0

私たちの推薦は考慮されていないと推測されます:) –

+0

うーん...それにはさまざまな方法がありますが、私たちの考えは一致します:) – ShankarSangoli

0

変数をフラグとして設定できます。 var canClick = ($('#formVersion').val() != 'Print');次に、.header要素のクリックハンドラで、コードを実行する前にcanClickがtrueであるかどうかを確認します。

ハンドラを削除したい場合は、イベントオブジェクトを変数に割り当てることができます。 var eventObj = #('.header').data('events');これは、そのオブジェクトに割り当てられたすべてのハンドラを持つオブジェクトを提供します。クリックイベントを再割り当てするには、$('.header').bind('click', eventObj.click[0]);

0

バインドで固く試した後、アンバインド、オン、オフ、クリック、アタッチ、removeAttr、propを作成しました。 私は次のようなシナリオを持っています。私のHTMLでは、インラインのonclickハンドラを添付していません。私は次のように使用されるJavaScriptから、後の時点でこれを削除するには

$(element).attr('onclick','myFunction()'); 

は、その後、私はJavaScriptで私は、インラインのonclickハンドラを追加するには、次を使用

$(element).prop('onclick',null); 

これは、 Javascriptでクリックイベントを動的にバインドしたりアンバインドしたりするのに役立ちました。あなたの要素にインラインonclickハンドラを挿入しないでください。

+1

これに関する問題のカップルは、まず2つの異なるメソッドを使用して、 onclickハンドラ。両方に '.prop'を使用すると何が問題になりますか?第2に、最初の行で行ったように、関数に "文字列"参照を渡すのは良い習慣ではありません。これが悪いeval()の呼び出しにつながっていることがわかっている限りです。 :) –

+2

@マークウォーターズ - 要するに、私は彼がonclickを正しく設定するためにattrを使い、IEで取り除くためにpropを使うことを余儀なくされたと思います。 jQueryの "removeattr" docs: "注:.removeAttr()を使用してインラインonclickイベントハンドラを削除しても、Internet Explorer 6,7または8では目的の効果は得られません。潜在的な問題を回避するには、代わりに.prop()を使用してください: " –

+0

@TonyCarbone訂正ありがとう –

関連する問題