2009-09-19 14 views
11

tengo el código HTML siguiente:jQuery: seleccione la casilla de verificación basado en el nombre y el valor

<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> 

Y estoy tratando de implementar selectCheckbox(chkbox, value), que debería:

  1. búsqueda de toda la radio de la name = chkbox y establecer attr('checked') = false
  2. búsqueda de la radio que tiene name = chkbox AND val() = value y establecer attr('checked') = true

que no se puede averiguar, lo que el selector hacia la derecha es, He intentado lo siguiente sin ninguna suerte:

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' 

Por favor, hágamelo saber lo que estoy haciendo mal. ¡Muchas muchas gracias!

+0

que no debería tener múltiples elementos con el mismo ID ("C1") – Zed

+0

Tienes razón, he eliminado el ID de ahora. ¡Gracias! – MrG

+2

"Nota: en jQuery 1.3 [@attr] los selectores de estilo fueron eliminados (anteriormente estaban desaprobados en jQuery 1.2).Simplemente elimine el símbolo '@' de sus selectores para que funcionen nuevamente. " – Zed

Respuesta

4

Usaría la posición DOM relativa para hacer la navegación. Tenga en cuenta también que no puede tener diferentes elementos con la misma identificación, pero en este caso no es necesario, ya que puede usar el selector de atributos en el nombre para encontrar las entradas correctas. Tenga en cuenta que ya sabe cuál de las diversas entradas debe verificarse según la posición del enlace en el que se hace clic. Prefiero tener el código separado del marcado, así que le di a los enlaces una clase para que sean más fáciles de seleccionar y moví la aplicación del manejador de clics al código.

Actualización: Tenga en cuenta que he eliminado el código para desmarcar las otras radios. Con las radios, establecer una para que se marque debe desmarcar automáticamente a cualquiera de las demás.

$(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

Probar $("input[name='C1'] :checked]"). Los ID deben ser únicos, por lo que jquery probablemente no espere devolver más de un elemento.

1

No puede tener múltiples elementos con la misma identificación en una página. Todos sus elementos de entrada tienen el id "C1".

+1

Puede, pero es algo malo por varias razones. Pruébelo y observe la diferencia entre $ (" # id ") y $ ("[id = id]). Este último devolverá un conjunto envuelto, sin embargo, muchos elementos comparten el ID "id", mientras que el primero devuelve un conjunto envuelto que contiene solo el primer elemento declarado con este id. –

7

Gracias por su ayuda, que finalmente consiguieron:

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

Creo que es más código de lo que necesita. – tvanfosson

22

Prueba esto:

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

Puede utilizar prop() en lugar de attr() si su versión de jquery> 1.6

Consulte este enlace http://api.jquery.com/prop/

A partir de jQuery 1.6, el método .prop() proporciona una manera de forma explícita recuperar valores de propiedad, mientras que .attr() recupera atributos.

Así que el código que busca se parece más a

$('input:checkbox[name="Validators"][value="' + v + '"]').prop('checked',true); 
Cuestiones relacionadas