2009-09-10 13 views
40

Sto tentando di disabilitare questi pulsanti di opzione quando viene fatto clic sul collegamento loadActive, ma per qualche motivo disabilita solo il primo nell'ordine e quindi ignora il resto.Disabilitazione dei pulsanti di opzione 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> 

Ed ecco il jquery sto 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

Hai provato a usare Firebug, utilizzare il selettore per ottenere un array di elementi e vedere quanti sono nella matrice? –

+0

tutto quello che hai lì funziona bene per me. – geowa4

+0

Sì, funziona anche nella mia sandbox, anche se questo viene da un file molto più grande, penso che qualcos'altro stia facendo che non funzioni. Usando le classi, selezionandola in modo diverso SOLO disabilita la prima radio e non il resto. Ma in sandbox funziona perfettamente ugh – user46785

risposta

8

In primo luogo, la sintassi è valida

jQuery("input[name=ticketID]") 

secondo, hai provato:

jQuery(":radio") 

anziché?

terzo, perché non assegnare una classe a tutti i pulsanti di opzione e selezionarli per classe?

+1

In realtà "input [name = 'ticketID']" è una sintassi valida, le virgolette singole non sono semplicemente necessarie. – karim79

+1

perché non usare solo il nome? e selezionali da quello? dovrebbe funzionare bene; l'ho fatto un milione di volte. – geowa4

+0

Sono d'accordo con mkoryak: "assegna una classe a tutti i pulsanti di opzione e selezionali per classe" –

1

È necessario utilizzare le classi per renderlo più semplice, anziché il nome dell'attributo o qualsiasi altro selettore jQuery.

+0

fammi indovinare, usi le rotaie? – geowa4

+1

In realtà non lo faccio. Puoi elaborare? Le rotaie – rogeriopvl

+0

dispongono di tale notazione per le caselle di controllo. ma puoi avere più di due oggetti con lo stesso nome senza "[]" – geowa4

43

ho refactoring il codice un po ', questo dovrebbe funzionare:

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

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

Se ci sono più di due pulsanti di opzione sul modulo, dovrete modificare il selettore, ad esempio, è possibile utilizzare il starts with attribute filter per scegliere le radio il cui ID inizia con ticketID:

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

che disabiliterà tutti i pulsanti di opzione in quel modulo. nella sua domanda ce ne potrebbero essere solo due, ma probabilmente ce ne saranno di più. – geowa4

+0

@ geowa4 - vero, ho pensato che fossero le uniche radio sulla sua forma. In ogni caso, ho modificato per essere un po 'più utile. – karim79

+1

+1 per rimuovere l'inutile '.each()'; '.attr()' si applicherà comunque a tutti gli elementi selezionati. – gnarf

3

ho appena costruito un ambiente sandbox con il tuo codice e ha funzionato per me. Ecco cosa ho usato:

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

Ho provato in FF3.5, passando a IE8 ora. E funziona anche in IE8. Quale browser utilizzate?

35

Rimuovere il vostro "ogni" e basta usare:

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

così semplice. Funziona

+0

Snippet di codice piacevole .. –

2

basta usare jQuery prop

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