2010-10-13 17 views
7

Dla odrobiny tła, mam wiele pól wyboru, każdy ważony z innym "wynikiem". Gdy pole wyboru zostanie zmienione, muszę obliczyć wynik. Pomyślałem, że coś takiego działa, ale nie wygląda na to, że zdarzenie .change jest poprawnie powiązane.Jquery: Wiązanie zmiany na wiele pól wyboru

$(document).ready(function() { 
    bindSomeCheckboxes(); 
}); 

function bindSomeCheckboxes() { 
    var score=0; 
    var checkboxes = { 
     "id_1" : 3, 
     "id_2" : 1, 
     "id_3" : 2, 
     "id_4" : 5 
    }; 

    $.each(checkboxes, function(key, value) { 
     $("#"+key).change(function(key,value) { 
      if ($("#"+key).is(':checked')) { 
       //add this ids value to score 
      } else { 
       //subtract value from score 
      } 
     }); 
    }); 
} 

Wiem, że poprawnie przechodzi przez macierz, ale alert w .change nigdy nie jest widoczny.

+0

To powinno być ': checked' zamiast': clicked', zobacz moją odpowiedź uzyskać więcej informacji. – BrunoLM

+0

Wygląda na to, że wszystkie odpowiedzi nie uwzględniają faktu, że każdy identyfikator ma unikalny "wynik". Właśnie dlatego mam odwzorowanie id -> score. Dokonałem kliknięcia -> zaznaczonej korekty powyżej i zmieniłem komentarze, aby pokazać, co próbuję osiągnąć. Przyznam, że mogę wszystko źle postąpić. ;) –

+0

Dodałem odpowiedź, która zachowuje podstawową strukturę, z którą pracowałeś. Myślę, że próbujesz odwołać się do 'klucza' wewnątrz handler'a, myśląc, że będzie on miał ID. Kłopot polegał na tym, że dałeś swojemu handlerowi własny parametr 'key', który w rzeczywistości odnosi się do obiektu' event'. Usuń (lub zmień nazwę), a będziesz miał "klucz". Ale nie potrzebujesz tego, ponieważ masz bezpośrednie odniesienie do identyfikatora, którego potrzebujesz, ponieważ 'this' odnosi się do tego, który otrzymał zdarzenie, więc' this.id' jest jego identyfikatorem. – user113716

Odpowiedz

4

Jeśli naprawdę chciał wziąć tego podejścia z użyciem identyfikatorów, chciałbym zrobić osobną tablicę z identyfikatorami i zrobić .join() aby stworzyć selektor.

Niektóre rzeczy do uwaga:

  • Zamiast .is(':clicked') lub .is(':checked') użyć this.checked. O wiele bardziej wydajny.
  • obsługi zdarzeń w jQuery mieć jeden parametr, który odwołuje się do event. Masz 2 dla key,value. To sprawia, że ​​key w module obsługi odwołuje się do tego obiektu zamiast do key z $.each().
  • Wewnątrz uchwytu, this odnosi się do tego, który został kliknięty.
  • Ponieważ masz odniesienie do elementu this, nie potrzebujesz odniesienia do key w $.each().Możesz po prostu zrobić this.id.

function bindSomeCheckboxes() { 
    var score=0; 
    var checkboxes = { 
     "id_1" : 3, 
     "id_2" : 1, 
     "id_3" : 2, 
     "id_4" : 5 
    }; 

    var arrayOfIds = []; // to store array of ids 

    $.each(checkboxes,function(key, val) { // populate array with ids 
     arrayOfIds.push(key); 
    }); 

     // create a selector of the IDs 
    $("#" + arrayOfIds.join(',#')).change(function() { 
      // alert the score 
     alert(checkboxes[ this.id ]); 
     if (this.checked) { 
      //do something when it is checked 
     } else { 
      //do something else 
     } 
    }); 
} 
+0

Dziękuję. To, czego szukałem, wyjaśnienie mojego niezrozumienia tego, co się dzieje i możliwe rozwiązanie. +1 :) –

+0

@Magic - Nie ma za co, daj mi znać, jeśli masz jakieś pytania: o) – user113716

+0

Heh mimo wszystko to właśnie zdałem sobie sprawę, że to nie działa częściowo dlatego, że div zawierający te pola wyboru nie są dostępne na $ (dokument) .ready ... Dobre czasy debugowania niewłaściwych rzeczy. –

0

stosowanie try „wiązać” i „: zaznaczone”

$.each(checkboxes, function(key, value) { 
    $(this).bind('change', function() { 
     if ($(this).is(':checked')) { 
     //do something when it is checked 
     } else { 
     //do something else 
     } 
    }); 
}); 
+0

W jQuery $ (this) .change (... jest skrótem dla $ (this) .bind ("zmień", ... – Fenton

2

Polecam uzyskania pól wyboru w bardziej naturalny sposób ...

$("input[type='checkbox']").change(function() { 
    alert("Event is bound"); 
}); 

Jeśli chcesz ograniczyć których wyboru, aby użyj, możesz dodać klasę, ale jeśli możesz uniknąć dodawania niepotrzebnych zajęć, twój html będzie czystszy.

7

polecam dodanie pojemnika i zaznacz wszystkie pola wyboru na raz.

A co do Twojego pytania, podpis razie jest źle, prawidłowa jest function(e){}. Musisz również sprawdzić, czy element jest zaznaczony, a nie kliknięty.

$("#chk").change(function(e){ 
    if ($(this).is(":checked")) 
     alert("checked"); 
    else 
     alert("not checked"); 
}); 

Aby łatwiej użyć pojemnik

HTML Sample

<div id="checks"> 
    <input type="checkbox" id="chk1" /> 
    <input type="checkbox" id="chk2" /> 
    <input type="checkbox" id="chk3" /> 
    <input type="checkbox" id="chk4" /> 
</div> 

A dla wyników, wolę, aby ustawić dane na temat elementów, np:

$("#chk1").data("Score", 3); 
$("#chk2").data("Score", 1); 
$("#chk3").data("Score", 2); 
$("#chk4").data("Score", 5); 

$("#checks :checkbox").change(function(e){ 
    if ($(this).is(":checked")) 
     alert("checked Score: " + $(this).data("Score")); 
    else 
     alert("not checked Score: " + $(this).data("Score")); 
}); 
+0

Podobają mi się również to podejście.Dziękuję za coś innego Bruno –

Powiązane problemy