2011-12-13 11 views
2

私はjQuery初心者ですが、今は既存のスクリプトを修正することに頼っていますが、近い将来jQuery APIの深みを掘り下げて計画します。このjQueryコードをどうすれば改善できますか?

jQueryスニペットを使用しています。これはナビゲーションメニューのドロップダウン内に5つのサブメニューがあり、チェックボックスで動的に入力されます。

  • は、(サブメニュー内のすべてのチェックボックスを選択する)全てを選択し、ID =「checkAll」
  • 選択解除全て(解除全サブメニュー内のチェックボックスをチェックする):各サブメニューの下部に

    Iは4つのボタンを持っています、ID = "uncheckAll"
  • キャンセルが(任意およびnoneにサブメニュースタイルの表示を切り替えた場合、すべてのチェックボックスをチェックする選択解除)、ID = "cancelSelection"
  • 確認(noneにサブメニュースタイルの表示を切り替えます)、ID = "confirmSelection"
  • このボタンが機能するために

だから、私は一緒にこのコードの平和を置く:

<script type="text/javascript"> 
    $(document).ready(function(){ 
    // dropdown 1 
    $("#mega-menu-item-1 #checkAll").click(function() { 
     $("#mega-menu-item-1 .ez-checkbox").addClass("ez-checked"); 
    }); 
    $("#mega-menu-item-1 #uncheckAll").click(function() { 
     $("#mega-menu-item-1 .ez-checkbox").removeClass("ez-checked"); 
    }); 
    $("#mega-menu-item-1 #cancelSelection").click(function() { 
     $("#mega-menu-item-1").removeClass("mega-hover"); 
     $("#mega-menu-item-1 .ez-checkbox").removeClass("ez-checked"); 
     $("#mega-menu-item-1 ul.sub").toggle(); 
    }); 
    $("#mega-menu-item-1 #confirmSelection").click(function() { 
     $("#mega-menu-item-1").removeClass("mega-hover"); 
     $("#mega-menu-item-1 ul.sub").toggle(); 
    }); 
    // dropdown 2 
    $("#mega-menu-item-2 #checkAll").click(function() { 
     $("#mega-menu-item-2 .ez-checkbox").addClass("ez-checked"); 
    }); 
    $("#mega-menu-item-2 #uncheckAll").click(function() { 
     $("#mega-menu-item-2 .ez-checkbox").removeClass("ez-checked"); 
    }); 
    $("#mega-menu-item-2 #cancelSelection").click(function() { 
     $("#mega-menu-item-2").removeClass("mega-hover"); 
     $("#mega-menu-item-2 .ez-checkbox").removeClass("ez-checked"); 
     $("#mega-menu-item-2 ul.sub").toggle(); 
    }); 
    $("#mega-menu-item-2 #confirmSelection").click(function() { 
     $("#mega-menu-item-2").removeClass("mega-hover"); 
     $("#mega-menu-item-2 ul.sub").toggle(); 
    }); 
    // dropdown 3 
    $("#mega-menu-item-3 #checkAll").click(function() { 
     $("#mega-menu-item-3 .ez-checkbox").addClass("ez-checked"); 
    }); 
    $("#mega-menu-item-3 #uncheckAll").click(function() { 
     $("#mega-menu-item-3 .ez-checkbox").removeClass("ez-checked"); 
    }); 
    $("#mega-menu-item-3 #cancelSelection").click(function() { 
     $("#mega-menu-item-3").removeClass("mega-hover"); 
     $("#mega-menu-item-3 .ez-checkbox").removeClass("ez-checked"); 
     $("#mega-menu-item-3 ul.sub").toggle(); 
    }); 
    $("#mega-menu-item-3 #confirmSelection").click(function() { 
     $("#mega-menu-item-3").removeClass("mega-hover"); 
     $("#mega-menu-item-3 ul.sub").toggle(); 
    }); 
    // dropdown 4 
    $("#mega-menu-item-4 #checkAll").click(function() { 
     $("#mega-menu-item-4 .ez-checkbox").addClass("ez-checked"); 
    }); 
    $("#mega-menu-item-4 #uncheckAll").click(function() { 
     $("#mega-menu-item-4 .ez-checkbox").removeClass("ez-checked"); 
    }); 
    $("#mega-menu-item-4 #cancelSelection").click(function() { 
     $("#mega-menu-item-4").removeClass("mega-hover"); 
     $("#mega-menu-item-4 .ez-checkbox").removeClass("ez-checked"); 
     $("#mega-menu-item-4 ul.sub").toggle(); 
    }); 
    $("#mega-menu-item-4 #confirmSelection").click(function() { 
     $("#mega-menu-item-4").removeClass("mega-hover"); 
     $("#mega-menu-item-4 ul.sub").toggle(); 
    }); 
    // dropdown 5 
    $("#mega-menu-item-5 #checkAll").click(function() { 
     $("#mega-menu-item-5 .ez-checkbox").addClass("ez-checked"); 
    }); 
    $("#mega-menu-item-5 #uncheckAll").click(function() { 
     $("#mega-menu-item-5 .ez-checkbox").removeClass("ez-checked"); 
    }); 
    $("#mega-menu-item-5 #cancelSelection").click(function() { 
     $("#mega-menu-item-5").removeClass("mega-hover"); 
     $("#mega-menu-item-5 .ez-checkbox").removeClass("ez-checked"); 
     $("#mega-menu-item-5 ul.sub").toggle(); 
    }); 
    $("#mega-menu-item-5 #confirmSelection").click(function() { 
     $("#mega-menu-item-5").removeClass("mega-hover"); 
     $("#mega-menu-item-5 ul.sub").toggle(); 
    }); 
}); 

各サブメニューには、ID番号のメガメニュー項目-1/2/3/4/5を有しています、私はすべてのサブメニュー項目のそれぞれのボタンアクションを繰り返します。

少しさらにそれを説明するには、次の

  1. クラス.mega-ホバーは、私が使用しているた、megamenuスクリプトによって、親html要素に追加されたサブメニューが表示されたとき(それは状態表示があります。ブロック)。ですから、.removeClass( "mega-hover")でサブメニューを閉じるときにもこのクラスを削除する必要があります。

  2. クラス.ez-checkedは、checkboxスタイリングのためにjquery snippetによって使用されるので、各チェックボックス要素はdiv内のクラス.ez-checkboxでラップされます。チェックボックスをオンにすると、追加の.ez-checkedクラスが追加されるので、キャンセルするかチェックを外すと、このクラスを.removeClass( "ez-checked")で削除する必要があります。

  3. 私はポイント1で述べたように、私はサブメニューの表示状態をトグルするメガメニュースクリプトを使用しています。 #confirmSelectionまたは#cancelSelectionでは、$( "#mega-menu-item ul.sub")とトグルする必要があります。

私は、これはこのすべてを行うにはスムーズな方法ではありません確信しているので、私は私が繰り返しがたくさんあると思います、このコードを最適化する方法を、提案するために、経験豊富な開発者を求めています少なくとも。

+0

あなたは同じID(例えば '#checkAll')といくつかの要素を持っています。これは有効なHTMLではありません。 –

答えて

1

まず、idの代わりにクラスを操作します。 あなたは、例えば、次のようにクリックしcheckall簡素化することができます:

$(".checkAll").click(function() { 
    var parent = $(this).closest(".mega-menu-item"); 
    parent.removeClass("mega-hover"); 
    $("ul.sub", parent).toggle(); 
} 
+0

#mega-menu-item idはmegamenuスクリプトから継承されており、私はそれを変更することはできず、メニューを破ることもできません。 idがネイティブJavaScriptメソッドgetElementById()に直接マップするため、IDセレクタを使用するのはベストプラクティスではありません。 – weezle

+0

IDは、Felix Kingが言及したように1ページに1回しか発生しません。特定の時点でどの要素が読み込まれているかわからないなど、単一ページのインターフェイスで作業しているときは、これらを避ける必要があります。スクリプトを変更して、クラスベースの.mega-menu-itemを使用しないようにすることができます。 .closest( 'div')を実行します。たとえば、それが最も近いdivの親である場合です。 – c4urself

+0

アップ、私はフェリックスの答えを逃した。もちろん、それは有効なHTMLではない、私はすべてのボタンとスクリプトのIDをクラスに変更しました。これまでのところすべてが機能しています。 次の手順では、あなたの提案を実装しようとします。 – weezle