2009-09-19 13 views
11

Mam następujące HTML:jQuery: Wybierz pole wyboru na podstawie nazwy i wartości

<form id="test"> 
    <input type="radio" value="A" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'A');"> OPTION-A </a> 

    <input type="radio" value="B" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'B');"> OPTION-B </a> 

<input type="radio" value="C" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'C');"> OPTION-C </a> 

    // several other: C2, C3, .. 
</form> 

I próbuję wdrożyć selectCheckbox(chkbox, value), który powinien:

  1. wyszukać wszystkie radia z name = chkbox i ustawić attr('checked') = false
  2. poszukiwania radia mającego name = chkbox AND val() = value i ustaw attr('checked') = true

nie mogę dowiedzieć się, co wybierak w prawo jest Próbowałem następujących bez powodzenia:

var name = "#" + chkbox + " :checked"; 
$(name).each(.. // doesn't work 

$('#'+chkbox).each(.. // if finds only the first occurence 
         // of i.e. C1, although I would expect 3 

$("input[@name='"+chkbox+"']").each(function() { .. 
// leaves me with the following error: 
// Warning: Expected attribute name or namespace but found '@name' 

Proszę dać mi znać, co robię źle. Wielkie dzięki!

+0

Nie powinniśmy mieć wiele elementów z tym samym identyfikatorem („C1”) – Zed

+0

Masz rację, usunąłem identyfikator teraz. Dzięki! – MrG

+2

"Uwaga: W jQuery 1.3 selektory stylu @attr zostały usunięte (były wcześniej przestarzałe w jQuery 1.2).Po prostu usuń symbol "@" z selektorów, aby znów zadziałały. " – Zed

Odpowiedz

4

Używam względnej pozycji DOM do nawigacji. Zauważ również, że nie możesz mieć różnych elementów o tym samym id, ale w tym przypadku nie jest to konieczne, ponieważ możesz użyć selektora atrybutów na nazwie, aby znaleźć właściwe dane wejściowe. Zauważ, że już wiesz, które z różnych wejść muszą być sprawdzone na podstawie pozycji klikniętego łącza. Wolę, aby kod był oddzielony od znaczników, więc dałem linki klasie, aby ułatwić wybór i przeniesienie aplikacji obsługi kliknięć do kodu.

Aktualizacja: Zauważ, że usunąłem kod, aby odznaczyć pozostałe odbiorniki radiowe. W przypadku radia ustawienie jednego z nich powinno automatycznie usuwać zaznaczenie pozostałych.

$(function() { 
    $('a.checkbox-selector').click(function() { 
     // get the checkbox immediately preceding the link -- this should 
     // be checked. Checking it should automatically uncheck any other 
     // that may be checked. 
     $(this).prev(':checkbox'); 
       .attr('checked',true); 
     return false; // don't process the link 
    }); 
}); 

<form id="test"> 
    <input type="radio" value="A" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-A </a> 

    <input type="radio" value="B" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-B </a> 

    <input type="radio" value="C" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-C </a> 

    <!-- several other: C2, C3, ... --> 
</form> 
0

Wypróbuj $("input[name='C1'] :checked]"). Identyfikatory powinny być unikalne, więc jquery prawdopodobnie nie spodziewa się zwrócić więcej niż jednego elementu.

1

Nie można mieć wielu elementów o tym samym identyfikatorze na jednej stronie. Wszystkie twoje elementy wejściowe mają identyfikator "C1".

+1

Możesz, ale to jest złe z kilku powodów. Spróbuj i zauważ różnicę między $ (" # id ") i $ ("[id = id]). Ta ostatnia zwróci zapakowany zestaw wielu elementów o identyfikatorze id ", podczas gdy pierwsza zwraca zawijany zestaw zawierający tylko pierwszy zadeklarowany element o tym id. –

7

Dzięki za pomoc, ale w końcu dostał go:

function selectTestAnswer(chkbox, value) { 
    $("[name="+chkbox+"]").each(function() { 
     if ($(this).val() == value) 
      $(this).attr('checked', true); 
     else 
      if ($(this).attr('checked') == true) 
       $(this).attr('checked', false); 
}); 

}

+0

Myślę, że to więcej kodu niż potrzebujesz. – tvanfosson

22

Spróbuj tego:

$('input:radio[name="' + chkboxName + '"][value="' + value + '"]') 
    .attr('checked', 'checked'); 
5

Można użyć podpory() zamiast attr() jeśli twoja wersja jquery> 1.6

Patrz link http://api.jquery.com/prop/

Jak jQuery 1.6, metoda .prop() zapewnia sposób wyraźnie pobierania wartości nieruchomości, natomiast .attr() pobiera atrybuty.

Więc kod szukasz wygląda bardziej jak

$('input:checkbox[name="Validators"][value="' + v + '"]').prop('checked',true); 
Powiązane problemy