2013-01-13 10 views
9

Biorąc pod uwagę ten kod HTML:

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

Ten kod jQuery:

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

powraca hi, choć nie ma value atrybut na pierwszej opcji w menu.

Jeśli atrybut <option> ma atrybut value, atrybut value jest zwracany zgodnie z oczekiwaniami.

Jak mogę uzyskać wartość zwracaną powyższego kodu to undefined/coś innego, co mogę zidentyfikować? Czy mogę sprawdzić, czy jest ustawiony atrybut value i uruchomić tylko powyższy kod, jeśli tak nie jest?

+1

Istnieje niejawny atrybut "value". Prawdopodobnie chcesz wypróbować ': not ([value])' w twoim selektorze. –

Odpowiedz

18

użyć selektora :not([attr]):

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

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

ja także zweryfikowane że po zmienia, [value] nadal zgłasza się jako nieustawiona, więc nadal otrzymujesz te same dwa elementy bez value atrybut.

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

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

+0

Muszę sprawdzić, czy jest to pierwsza opcja, która nie ma "wartości". Na podstawie Twojego postu próbowałem: 'if ($ (" # opcja menu: nie ([wartość]) "first() === $ (" # menu option "). First())' bez szczęście (zawsze "fałszywe"). Czy masz jakies pomysły? (Sprawdziłem w konsoli przeglądarki, że dwa selektory zwracają ten sam element) – stackunderflow

+0

OK, mam to: '($ (" # opcja menu: nie ([wartość]) ") [0] === $ ("# menu option") [0]) ". '[0]' (zwraca element) zamiast '.first()' (zwraca obiekt jQuery). Dzięki. – stackunderflow

+1

Oczywiście, zobacz: http://jsfiddle.net/userdude/NQm54/3/ Użyj '$ .is()', jest znacznie czystszy i bezpośredni. –

1

Wartość domyślnie przyjmuje wartość tekstową, jeśli atrybut wartości nie jest ustawiony. Po prostu ustaw wartość atrybutu na jakąś wartość, abyś mógł ją zidentyfikować, np. ciąg pusty, jak pokazano poniżej

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

Wtedy ten $("#menu option").first().attr("value") zwróci pusty ciąg

+1

Dzięki, ale używam tego w wtyczce i dlatego nie mam kontroli nad kodem HTML użytkowników wtyczek. – 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

Użyj tego $("option:selected", $("#menu")).attr("value");

Jeśli wybrana opcja nie ma żadnego atrybutu value, niezdefiniowana zostaną zwrócone, które można uchwycić poprzez foo!

Powiązane problemy