2013-01-13 10 views
9

Dato questo codice HTML:

<select id="menu"> 
    <option>hi</option> 
    <option>bye</option> 
</select> 

Questo codice jQuery:

$("#menu option").first().attr("value") 

rendimenti hi, anche se non v'è alcun attributo value sulla prima opzione nel menu.

Se lo <option> ha un attributo value, l'attributo value viene restituito, come previsto.

Come posso avere il valore restituito del codice precedente essere undefined/qualcos'altro che posso identificare? O posso controllare se l'attributo value è impostato, e solo eseguire il codice sopra se non lo è?

+1

Esiste un attributo 'value' implicito. Probabilmente vuoi provare ': not ([value])' nel tuo selettore. –

risposta

18

Utilizzare il selettore :not([attr]):

$("#menu option:not([value])"); 

http://jsfiddle.net/userdude/NQm54/

ho anche verificato che dopo aver cambiato, la [value] riporta ancora come non impostato, quindi continui a ricevere gli stessi due elementi senza il 01 Attributo.

$('#menu').change(function(){ 
    console.log($(this).val()); 
    console.log($("#menu option:not([value])")); 
}); 

http://jsfiddle.net/userdude/NQm54/2/

+0

Ho bisogno di controllare se è la prima opzione che non ha il valore. In base al tuo post che ho provato: 'if ($ (" opzione di menu #: non ([valore]) "). First() === $ (" opzione di menu # "). First())' senza fortuna (sempre 'falso'). Hai qualche idea? (Ho verificato nella console del browser che i due selettori restituiscono lo stesso elemento) – stackunderflow

+0

OK, ho capito: '($ (" opzione di menu #: non ([valore]) ") [0] === $ ("opzione di menu #") [0]) '. '[0]' (restituisce elemento) invece di '.first()' (restituisce l'oggetto jQuery). Grazie. – stackunderflow

+1

Certo, vedi: http://jsfiddle.net/userdude/NQm54/3/ Usa '$ .is()', è molto più pulito e diretto. –

1

Il valore è impostato per default sul valore di testo se l'attributo valore non è impostato. Basta impostare il valore dell'attributo per un valore in modo da poterlo identificare, ad es. una stringa vuota come mostrato sotto

<select id="menu"> 
    <option value="">hi</option> 
    <option>bye</option> 
</select> 

Allora questo $("#menu option").first().attr("value") restituirà una stringa vuota

+1

Grazie, comunque sto usando questo in un plugin e quindi non ho alcun controllo sul codice HTML degli utenti del plugin. – stackunderflow

1
var option = document.getElementById("menu").options[0]; 
if (option.getAttribute("value") !== null) { 
console.log("Has value: " + option.value); 
} 
else { 
console.log("Doesn't have a value."); 
} 
2
$("#menu option:eq(0)").not("[value]").length == 1 
0

Utilizzare questa $("option:selected", $("#menu")).attr("value");

Se l'opzione selezionata non ha alcun attributo value, non definito verrà restituito il quale è possibile catturare attraverso! Foo