2016-06-29 8 views
0

Ich habe ein Skript, das ich hart arbeitete, aber es ist ziemlich hässlich, aber es funktioniert. Sie können alle Kontrollkästchen aktivieren (mit .select-all), und wenn eines dieser Kontrollkästchen (.chk-box) deaktiviert ist, wird auch die Option .select-all deaktiviert. Außerdem wird das .select-all auch ein div (.hidethis) verbergen. Ich bin im Lernzustand, also wenn jemand (wenn einfach) mir einen schöneren Code mit dieser Funktionalität zeigen kann, ist es sehr willkommen! Es kann mir viel lernen!Dieses Skript funktioniert, wie ich will, aber seine hässliche

<script type="text/javascript"> 

     $("document").ready(function() 
     { 
      if($(".select-all").is(":checked"))  
      {    
       $(".hidethis").hide(); 
      } 
      else 
      { 
       $(".hidethis").show(); 
      } 
     }); 

     $(".select-all").change(function() 
     { 
      if (this.checked) 
      {    
       $(".chk-box").prop('checked', $(this).prop("checked")); 
       $(".hidethis").hide(); 
      } 
      else 
      { 
       $(".chk-box").removeAttr("checked"); 
       $(".hidethis").show(); 
      } 
     }); 

     $(".chk-box").change(function() 
     { 
      if($(".chk-box").length == $(".chk-box:checked").length) 
      { 
       $(".select-all").prop('checked', $(this).prop("checked")); 
       $(".hidethis").hide(); 
      } 
      else 
      { 
       $(".select-all").removeAttr("checked"); 
       $(".hidethis").show(); 
      } 
     }); 

</script> 
+0

'$ (" hidethis") bereit()' sollte '$ (document) .ready()' sein. jQuery ignoriert das Element, an das Sie den '.ready()' - Handler binden, da dies nur für das Dokument sinnvoll ist. – Barmar

+0

Es gibt nur eine '.select-all'-Checkbox, oder? Also benutze einfach 'if ($ (". Select-all"). Is (": checked")) 'um zu testen, ob es aktiviert ist. Und im Handler '.change()' können Sie einfach 'if (this.checked)' verwenden. – Barmar

+0

Danke, die ersten beiden Dinge korrigiert. Ich bin mir nicht sicher, was Sie mit dem '.change()' Handler denken. Was sollte 'if (this.checked)' ersetzen? –

Antwort

3

Ihr Code ist nicht hässlich - aber if($(".select-all").length == $(".select-all:checked").length) ist nicht sofort klar, was es tut (wenn Ihr Ziel ist hier die Lesbarkeit ist). Außerdem brauchen Sie nicht das if/else auf der Select-All-Änderung, da Sie immer alle chk-Boxen auf den Wert von select-all setzen wollen.

Here's a fiddle I made das ist ein bisschen sauberer. Ich mache einfach eine Schleife über alle Kontrollkästchen, um zu sehen, ob sie alle gesetzt sind oder nicht. Der Check All Handler wendet nur seinen Wert auf alle Checkboxen an. Das Versteck kann nur in diesen beiden Ereignissen behandelt werden.

The JS:.

$(".check").on("change", function() { 
    var allChecked = true; 
    $(".check").each(function(i) { 
     allChecked = allChecked && $(this).prop("checked"); 
    }); 
    $(".check-all").prop("checked", allChecked); 

    allChecked ? $(".hidethis").hide() : $(".hidethis").show(); 
}); 

$(".check-all").on("change", function() { 
    var checked = $(this).prop("checked"); 
    $(".check").prop("checked", checked); 

    checked ? $(".hidethis").hide() : $(".hidethis").show(); 
}); 
+0

Viel sauberer, danke! Und deine Kommentare vor dem Code ergeben für mich (jetzt) ​​Sinn :) –

+0

Das ist schön und sauber ein weiterer Vorschlag, den ich machen würde ist, Ihre Selektoren in Variablen zu speichern 'var $ check = $ (". Check ")', 'var $ checkAll = $ (". check-all") ',' var $ hidethis = $ (". hidethis") ' Nicht, dass es für eine so kleine Stichprobe notwendig ist, aber es spart ein wenig Tipparbeit DOM-Lookups und Objekterstellung Jedes Mal, wenn es die Schleife ausführt, durchsucht es das DOM, um alle von $ (". Check") usw. zu finden. – Enjayy

+0

Noted Enjayy! ty –

Verwandte Themen