2011-07-23 16 views
2

私はメニューとサブメニューを持っています。サブメニューのコンテンツはajaxで読み込まれます。JQUERY Toggle and Ajax

サブメニューが切り替わります。問題は、サブメニューを隠すためにクリックすると、それでもajax呼び出しが行われることです。

メニューを開くときにクリックするだけで、どのようにajaxコールを行うことができますか?

$("#showsubmenu").live("click", function() { 
       var attrib = $(this).attr('menuid'); 

       $("#"+attrib).toggle(); 
       $("#"+attrib).html("<h4>&nbsp;&nbsp;Loading links...</h4>"); 
       $.ajax({ 
        cache: false, 
        url: "submenu.php", 
        dataType: "html", 
        data: "&menuid="+attrib, 
        success: function (data) { 
         $("#"+attrib).html(data); 
         }, 
        error: function(jqXHR, textStatus, errorThrown) { 
         alert(textStatus); 
        } 

       }); 

      }); 

答えて

0

次の時間に開いてもサブメニューが作成されると、ajaxコールを作成しないパフォーマンス上の利点とともに、この単純なソリューションを試してみてください。これがあなたに役立つことを願っています。

$("#showsubmenu").live("click", function() { 
       var attrib = $(this).attr('menuid'); 
       var $attrib = $("#"+attrib); 

       $attrib.toggle(); 

       if(!$attrib.data("subMenuPopulated") && $attrib.is(":visible")){ 

        $attrib.html("<h4>&nbsp;&nbsp;Loading links...</h4>"); 
        $.ajax({ 
        cache: false, 
        url: "submenu.php", 
        dataType: "html", 
        data: "&menuid="+attrib, 
        success: function (data) { 
         $attrib.html(data).data("subMenuPopulated", true); 
         }, 
         error: function(jqXHR, textStatus, errorThrown) { 
         alert(textStatus); 
         } 
        }); 
       } 

      }); 
0

.toggle()は、オブジェクトの可視性を変更するので、あなたはそれのCSSのdisplayプロパティに対してチェックすることができます。すでに隠されていない場合は、Ajax-Callを起動する必要はありません。

2

私は過去にクラスを追加/削除していました。

が再び行われてAjax呼び出しを防ぐために.addClass(「サブメニュー仕掛け」)を使用し、成功ハンドラで次に

if(!$(this).hasClass("submenu-loaded")) {   
    ...Ajax call 
} 

のようなテストを追加します。

+0

私はこれを試してみました。ありがとう!メニューが開いているたびにリロードしたいのですが? – vitalyp

+0

代わりに.toggleClass( "submenu-loaded")を使うことができます。そうでない場合はクラスを追加し、存在しない場合は削除します(ただし、Ajax呼び出しの外で行う必要があります)。代わりに、 'else {$(this).removeClass( "submenu-loaded");}を追加することもできます。 } 'を上記のif()testに置き換えます。ポイントはクラスが存在しない場合は削除し、そうでない場合は追加します(そしてAjaxの呼び出しを行います)。 –

+0

ああ、あなたが好きなら回答を受け入れるか投票してください;-) –

0
 
if ($("#"+attrib).not(':visible')) { 
    ...run ajax code 
} 

これはちょうどそれがないならば、あなたはAjaxコードを実行することができ、サブメニューが表示されているかどうかを確認するためにチェックしています。

それとも、サブメニュー内のコードの存在を確認したい場合はあなたのような何かを行うことができます。見つからなかった場合は、

 
if ($("#"+attrib).html().length == 0) { 
    ...run ajax code 
} 

サブメニュー内の任意のHTMLのためこのコードのチェックをajaxコードを実行することができます。