2011-12-16 18 views
11

Info: jQuery 1.6.0 casella HTML:jQuery casella di controllo sempre restituisce 'undefined'

Prima ho fatto in modo jQuery è caricato con:

if(jQuery) { 
    alert("loaded"); 
} 

E questa è la caso, è caricato. Poi diementicato la linea dopo che uso:

var returnvalue = jQuery("#mycheckbox").attr("checked"); 
alert(returnvalue); 

Questo, per qualche ragione, sempre avvisi 'undefined'. Sono sicuro al 100% che l'ID esista. Ho anche provato il seguente metodo:

jQuery("#mycheckbox").find('input[type="checkbox"]').each(function(){ 
    alert("foo"); 
    if (jQuery(this).is(":checked")) 
     ReturnVal = true; 
}); 

Ma questo non fa apparire l'avviso.

Cosa sto sbagliando? Sono di gran lunga un esperto di jQuery o Javascript, ma dovrebbe funzionare ... giusto?

Edit: ho provato:

jQuery(document).ready(function() { 
    alert(id); 
    var returnvalue = jQuery("#" . id).prop("checked"); 
    alert(returnvalue); 
}); 

L'avviso (id) mi dà la giusta ID, ma vigile (returnValue) restituisce indefinito.

Ho anche provato:

if(jQuery) { 
    alert("loaded"); 
} 
jQuery(function() { 
    alert(id); 
    var returnvalue = jQuery("#" . id).attr("checked"); 
    alert(returnvalue); 
}); 

Stesso risultato

Edit2: Dopo aver utilizzato .prop e aggiungendo l'id con un '+' al posto di un '' (Abitudine PHP), funziona. Grazie a tutti per il vostro aiuto!

+1

'jQuery (" # ".id)' è semplicemente sbagliato. Stai chiedendo la proprietà 'id' della stringa' "#" '. – RightSaidFred

+0

Dannazione, hai ragione! Questa è la mia prima volta che lavoro con javascript, ho sempre lavorato con PHP, quindi sono abituato al ".". Hai perfettamente ragione, questo ha persino risolto il mio problema, grazie incredibilmente! – pbond

risposta

13
  • Se stai usando jQuery 1.6 o successiva, utilizzare prop() invece di attr():

var returnvalue = jQuery("#mycheckbox").prop("checked"); 

Questo perché se non hai inserito un esplicito checked attributo con il elemento, quindi l'attributo è undefined sebbene la proprietà abbia il suo valore predefinito.


  • è necessario eliminare il .find():
jQuery("#mycheckbox").each(function(){ 
    alert("foo"); 
    if (jQuery(this).is(":checked")) 
     ReturnVal = true; 
}); 

Compreso il codice HTML per la questione sarebbe utile.

4

Prova questa:

if(jQuery) { 
    alert("loaded"); 
} 
$(function() { 
    var returnvalue = $("#mycheckbox").attr("checked"); 
    alert(returnvalue); 
}); 

Aggiornamento

Se lo script è in cima alla pagina, si esegue prima che il codice HTML viene caricato. Durante quel periodo, attr ('checked') non è definito.

Inserendo il codice in una funzione anonima autoeseguibile $ (function() {...}), il codice viene eseguito dopo il caricamento HTML.

risposta al commento

tuo codice:

function isChecked(id) 
{ 
    if(jQuery) { alert("loaded"); } 
    $(function() { 
     alert(id); 
     var returnvalue = $("#" + id).attr("checked"); 
     alert(returnvalue); 
    }); 
} 

Prova questa. cosa avvisa?

function isChecked(id) 
{ 
    if(jQuery) { alert("loaded"); } 
    alert(id); 
    alert('there are this many elements with matching id: ' + $("#" . id).length); 
    var returnvalue = $("#" + id).attr("checked"); 
    alert(returnvalue); 
} 

Il terzo avviso indica "ci sono molti elementi con ID corrispondente: 0"?

+0

Ora ho il seguente codice: 'function isChecked (id) { if (jQuery) { alert (" loaded "); } $ (function() {alert (id); var returnValue = $ ("#" id) .attr ("controllato");. alert (returnValue); }); ' che ancora restituisce undefined. L'avviso (id) avverte l'ID corretto. Inoltre, quando premo submit (la pagina viene caricata già allora naturalmente), restituisce ancora undefined. – pbond

+0

si prega di postare aggiornamenti di codice nella tua domanda originale, sono difficili da leggere nei commenti. – danludwig

+0

Ciao, avvisa 'ci sono molti elementi con id corrispondente: 0'. – pbond

2

Utilizzare uno .prop$('#checkbox1').prop('checked'), jQuery 1.6 +

Per quanto riguarda gli attributi booleani, si consideri un elemento DOM definita dal markup HTML <input type="checkbox" checked="checked" />, ed assumere è in una variabile JavaScript denominato elem:

elem.checked true (Boolean) Will change with checkbox state 
$(elem).prop("checked") true (Boolean) Will change with checkbox state 
elem.getAttribute("checked") "checked" (String) Initial state of the checkbox; does not change 
$(elem).attr("checked")(1.6) "checked" (String) Initial state of the checkbox; does not change 
$(elem).attr("checked")(1.6.1+) "checked" (String) Will change with checkbox state 
$(elem).attr("checked")(pre-1.6) true (Boolean) Changed with checkbox state 

In base alle specifiche forme W3C, l'attributo controllato è un attributo booleano, che significa che la proprietà corrispondente è vera se l'attributo è presente a tutti, anche se, ad esempio, l'attributo non ha alcun valore o un valore di stringa vuoto. Il modo cross-browser compatibile preferito per determinare se una casella è selezionata è di controllare per un valore "truthy" sulla proprietà dell'elemento utilizzando uno dei seguenti:

if (elem.checked) 
if ($(elem).prop("checked")) 
if ($(elem).is(":checked")) 

Se utilizzando jQuery 1.6, il codice if ($(elem).attr("checked")) sarà recuperare l'attributo del contenuto effettivo, che non cambia quando la casella è selezionata e deselezionata. È inteso solo per memorizzare il valore predefinito o iniziale della proprietà selezionata. Per mantenere la compatibilità all'indietro, il metodo .attr() in jQuery 1.6.1+ recupera e aggiorna la proprietà per te in modo che non sia necessario modificare il codice per gli attributi booleani in .prop(). Tuttavia, il modo migliore per recuperare un valore verificato è con una delle opzioni sopra elencate. Per vedere come funziona nell'ultima versione di jQuery, selezionare/deselezionare la casella di controllo nell'esempio seguente.

Problemi correlati