2009-11-25 11 views
8

JQueryのaccordion moduleを使用してフォームウィザードを作成しています。問題は、アコーディオンメニューのマウスクリックをオーバーライドして、アコーディオンが次のセクションを表示する前にフォームが最初に検証されるようにすることです。JQueryアコーディオン - クリックイベントのバインド解除

私は次のことを試してみました:

$('#accordion h3').unbind(); 

$('#accordion h3').click(function() { 
    if (validate()) 
    { 
    $("#accordion").accordion('activate', 2); 
    }else 
    { 
    alert("invalid form"); 
    } 
} 

しかし、上記のコードは動作しません。アコーディオンの組み込みのクリックイベントが呼び出され、フォームが有効かどうかにかかわらず、アコーディオンは次のセクションを表示します。

$('#accordion h3').click(function(event) { 
    if (validate()) 
    { 
    $("#accordion").accordion('activate', 2); 
    }else 
    { 
    alert("invalid form"); 
    }   
    event.stopPropagation(); 
}); 

しかしのstopPropagation()呼び出しは全くアコーディオンの動作に影響を与えるとは思われない、次のセクションでは、フォームが有効であるか否かが表示されます。

は、私はまた、次のコードを試してみました。

私が間違っている可能性がありますか?

ありがとうございます!

答えて

13

さて、この機能をコーディングしてから休憩し、新しい目でそれに戻ってきました。

$("#accordion").accordion({event: false}); 

追加イベント:デフォルトのアクションを実行してから、アコーディオンメニューのマウスクリックを防ぐことができますアコーディオンintitializationコードに誤ったし、私は、カスタム書くときのvalidate()関数を実行するコードを扱うクリックすることができます。ここソリューションですユーザーがメニューをクリックすると、フォームが妥当性チェックに失敗した場合、アコーディオンのビルトインクリック機能が本質的にオーバーライドされます。

ところで、ここではJQuery UIのアコーディオンモジュールを使用しています。

ie7,8と連携し、クロム19、3.0.3

+0

私はまったく同じ問題を抱えています。どのようにして次のアコーデオンパネルに移ったのですか? –

0

event.stopPropogation()イベントターゲットに登録されているイベントハンドラが呼び出されなくなることはありません。event.bubblesがtrueの場合、イベントを停止してDOMをバブリングしません。イベントハンドラにfalseを返すか、event.preventDefault()を呼び出すか、詳細についてはhereまたはhereを参照してください。

+0

おかげで、私はでpreventDefault(信じます)リンク上のpreventDefault()がブラウザに新しいページを読み込ませないようにし、フォーム上のpreventDefault()がフォームの送信を妨げるような場合にのみ、私が対話している要素のデフォルトの動作を禁止します。 アコーディオンコードでは、デフォルトのアクションが起こらないようにするつもりはないが、私はアコーディオンコードで書かれたカスタマイズされたアクションが起こらないようにしようとしている。 アドバイスありがとうございますが、preventDefaultと 'return false'は問題を解決しません。 –

0

ソースコードから判断すると、イベントはh3のものではなく周囲のコンテナにバインドされています(プラグインはイベント委任を使用します)。さらに、ハンドラはclickにバインドされていませんが、click.ui-accordionにバインドされています。だから、試してみてください。

$('#accordion').unbind('click.ui-accordion'); 

そして、ちょうどレコードの(少なくともまだ)「jQueryのアコーディオンモジュール」のようなものはありません。 JQuery用のプラグインはいくつかあります。

+0

ありがとう、私は$( '#accordion')を試しました。前に、それは問題を解決しませんでした。問題はどのイベントがバインドされているのかという問題だと思いますが、アコーディオンのすべての要素のバインドを解除しようとしましたが、クリックはまだ検出され、コードはまだ実行されています。 –

+0

あなたは '$( '#accordion')をアンバインド( 'click')'または '$( '#accordion')してみましたか?unbind( 'click.ui-accordion')'?違いがあります。 '$( '#accordion h3')も試してください。unbind( 'click.ui-accordion')'。使用しているバージョンによって異なります。 –

+0

奇妙ですが、私はアコーディオン内のすべての要素をアンバインドしようとしましたが、クリックはまだJQueryによって登録されています。私はすべての次のコードを試しました: $( '#accordion')。unbind( 'click.ui-accordion');$( '#accordion')。unbind( 'クリック');$( '#accordion h3')。unbind( 'click.ui-accordion');$( '#accordion h3')。unbind( 'クリック');$( '#accordion div')。unbind( 'click.ui-accordion'); $( '#accordion div')。unbind( 'クリック');$( '#accordion div p')。unbind( 'click.ui-accordion'); $( '#accordion div p')。アンバインド( 'クリック'); しかし、役に立たない...私は1つを見つける場合、これに取り組んで、任意の解決策を投稿します –

0

ffをあなたはレディ機能の下で一緒に以下のコードを記述する必要があります。

$('#accordion h3').unbind('click'); 
$('#accordion a').unbind('click'); 
関連する問題