2009-09-10 10 views
40

Estoy intentando desactivar estos botones de opción cuando se hace clic en el enlace loadActive, pero por alguna razón solo deshabilita el primero en el orden y luego se salta el resto.Inhabilitación de los botones de opción con jQuery

<form id="chatTickets" method="post" action="/admin/index.cfm/"> 
    <input id="ticketID1" type="radio" checked="checked" value="myvalue1" name="ticketID"/> 
    <input id="ticketID2" type="radio" checked="checked" value="myvalue2" name="ticketID"/> 
</form> 
<a href="#" title="Load ActiveChat" id="loadActive">Load Active</a> 

y aquí está el jQuery que estoy usando:

jQuery("#loadActive").click(function() { 
    //I have other code in here that runs before this function call 
    writeData(); 
}); 
function writeData() { 
    jQuery("input[name='ticketID']").each(function(i) { 
    jQuery(this).attr('disabled', 'disabled'); 
}); 
} 
+1

¿Ha intentado utilizar Firebug, utilice el selector para obtener una matriz de elementos y ver cuántos hay en la matriz? –

+0

todo lo que tienes allí funciona bien para mí. – geowa4

+0

Sí, también funciona en mi caja de arena, aunque esto proviene de un archivo mucho más grande. Creo que algo más está haciendo que no funcione. El uso de clases, seleccionarlo de manera diferente aún SOLO desactiva la primera radio y no el resto. Pero en sandbox funciona perfectamente ugh – user46785

Respuesta

8

En primer lugar, la sintaxis válida es

jQuery("input[name=ticketID]") 

en segundo lugar, has:

jQuery(":radio") 

¿en lugar?

tercero, ¿por qué no asignar una clase a todos los botones de opción y seleccionarlos por clase?

+1

En realidad, "input [name = 'ticketID']" es una sintaxis válida, las comillas simples simplemente no son necesarias. – karim79

+1

¿por qué no usar el nombre? y seleccionarlos por eso? debería funcionar bien; lo he hecho un millón de veces – geowa4

+0

Estoy de acuerdo con mkoryak: "asigna una clase a todos los botones de opción y selecciónalos por clase" –

1

Debe usar las clases para hacerlo más simple, en lugar del nombre del atributo, o cualquier otro selector jQuery.

+0

déjame adivinar, ¿usas rieles? – geowa4

+1

En realidad, no. ¿Puedes elaborar? – rogeriopvl

+0

rails tiene ese material de notación de matriz para las casillas de verificación. pero puedes tener varios dos elementos con el mismo nombre sin "[]" – geowa4

43

He refactorizado su código un poco, esto debería funcionar:

jQuery("#loadActive").click(writeData); 

function writeData() { 
    jQuery("#chatTickets input:radio").attr('disabled',true); 
} 

Si hay más de dos botones de opción en el formulario, tendrá que modificar el selector, por ejemplo, puede utilizar el starts with attribute filter de seleccionar las radios cuya identificación comienza ticketID:

function writeData() { 
    jQuery("#chatTickets input[id^=ticketID]:radio").attr('disabled',true); 
} 
+0

que deshabilitará todos los botones de opción de esa forma. en su pregunta, solo podría haber dos, pero es probable que haya más. – geowa4

+0

@ geowa4 - cierto, supuse que esas eran las únicas radios en su forma. En cualquier caso, he editado para ser un poco más útil. – karim79

+1

+1 para eliminar el inútil '.each()'; '.attr()' se aplicará a todos los elementos seleccionados de todos modos. – gnarf

3

simplemente he construido un entorno de pruebas con su código y funcionó para mí. Esto es lo que utilicé:

<html> 
    <head> 
    <title>test</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
    </head> 
    <body> 
    <form id="chatTickets" method="post" action="/admin/index.cfm/"> 
     <input id="ticketID1" type="radio" checked="checked" value="myvalue1" name="ticketID"/> 
     <input id="ticketID2" type="radio" checked="checked" value="myvalue2" name="ticketID"/> 
    </form> 
    <a href="#" title="Load ActiveChat" id="loadActive">Load Active</a> 

    <script> 
     jQuery("#loadActive").click(function() { 
     //I have other code in here that runs before this function call 
     writeData(); 
     }); 
     function writeData() { 
     jQuery("input[name='ticketID']").each(function(i) { 
      jQuery(this).attr('disabled', 'disabled'); 
     }); 
     } 
    </script> 
    </body> 
</html> 

He probado en FF3.5, pasando a IE8 ahora. Y funciona bien en IE8 también. ¿Qué navegador estás usando?

35

eliminamos su "cada uno" y sólo tiene que utilizar:

$('input[name=ticketID]').attr("disabled",true); 

Ese simple. Funciona

+0

Buen fragmento de código .. –

2

sólo tiene que utilizar jQuery prop

$(".radio-button").prop("disabled", false); 
$(".radio-button").prop("disabled", true); // disable 
Cuestiones relacionadas