2013-03-23 10 views
16

Ich frage mich, ob es in Javascript möglich ist, die aktuell ausgewählten Optionen in einem <select multiple> Feld mit der Selctors API statt einer "dummen" Iteration über alle Optionen zu erhalten.Gewählte Optionen mit querySelectorAll

select.querySelectorAll('option[selected="selected"]') gibt nur die Optionen zurück, die im ursprünglichen HTML-Code als vorausgewählt markiert wurden, was nicht das ist, wonach ich suche. Irgendwelche Ideen?

+0

Ich denke, die einzige Möglichkeit über alle laufen ist 'option' Elemente und filtere diejenigen heraus, die nicht ausgewählt sind. –

Antwort

38

document.querySelectorAll('option:checked')

Funktioniert auch auf IE9;)

+0

[Sollte mit 9.0 arbeiten] (https://developer.mozilla.org/en-US/docs/CSS/:checked), Browserkompatibilität am Ende – zeroflagL

+0

Wenn jQuery eine Option ist, könnten Sie ': selected' verwenden Selector – zeroflagL

+0

Schade, aber gut zu wissen. – zeroflagL

1

Ich habe auch Ihr Problem erlebt, ich habe das Gefühl, dass es mit JavaScript zu tun hat, Änderungen im DOM nicht zu erkennen.

Hier ist eine Lösung:

jsFiddle

document.getElementById('test').onclick = function() { 
    var select = document.getElementById('select'); 
    var options = getSelectedOptions(select); 
    console.log(options); 
}; 

function getSelectedOptions(select) { 
    var result = []; 
    var options = select.getElementsByTagName('option'); 
    for (var i = 0; i < options.length; i++) { 
     if (options[i].selected) 
      result.push(options[i]); 
    }; 
    return result; 
} 
+0

Danke, das ist im Grunde, was ich schon mache. –

+0

JS erkennt diese Änderungen am DOM. Das Problem ist, dass die 'ausgewählte' DOM-Eigenschaft nicht serialisierbar ist. Das Attribut 'selected' entspricht der DOM-Eigenschaft' defaultSelected'. Wenn also nach dem Attribut 'in [selected] 'gesucht wird, werden Elemente zurückgegeben, bei denen die Eigenschaft' defaultSelected' auf' true' gesetzt ist. –