Wenn man im dynamischen Teil einer Webseite eine Select-Box mittels Javascript
mit neuen Werten füllen
möchte, so kann man das mehr oder weniger umständlich über das DOM mittels
document.createElement(), node.removeChild() und node.appendChild() erledigen.
Etwas einfacher sieht, zumindest auf den ersten Blick, die Nutzung der Eigenschaft innerHTML des
Select-Knotens aus. Auf den ersten Blick nur deshalb, weil zwar alle Mozilla-basierten Browser
und Opera damit kein Problem haben, der Internet Explorer - auch
in der aktuellen 8er Version - damit jedoch nicht korrekt umgehen kann.
Nicht korrekt umgehen heißt zu gut deutsch: Die Select-Box bleibt im IE leer!
Der „umständliche” Weg über das DOM wird u.a. von Microsoft selbst als
Workaround zu diesem BUG beschrieben.
Auch bei Mr. Foo gibt es eine angeregte Diskussion über den Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript.
Wer sich jedoch nicht durch das DOM hangeln möchte, weil z.B. die einzufügenden Options bereits als HTML-Text
vorliegen und erst mühsam wieder auseinandergenommen werden müßten, dem kann mit
einem kleinen Trick gehholfen werden. Der IE interpretiert die
Eigenschaft outerHTML, also einen Code inkl. öffnendem und schließendem select-Tag,
glücklicherweise korrekt.
Der Ansatz ist damit so logisch wie simpel. Man nehme einfach den aktuellen Text aus outerHTML,
filtere das öffnende und schließende select-Tag, setze das neue innerHTML dazwischen
und speichere das Ganze wieder als outerHTML des Select-Knotens.
Das Filtern übernimmt dabei eine Regular Expression.
var begin = pList.outerHTML.match(/(<select .*?>)/i);
var end = pList.outerHTML.match(/(<\/select>)/i);
Eine einfache Funktion zum browserübergreifend korrekten Füllen einer Select-Box sieht damit so aus:
function fillSelect(pList, pOptionHTML)
{
if (pList) {
if (pList.outerHTML) {
var begin = pList.outerHTML.match(/(<select .*?>)/i);
var end = pList.outerHTML.match(/(<\/select>)/i);
if (begin && end) {
var s = begin[1] + pOptionHTML + end[1];
pList.outerHTML = s;
}
}
else {
pList.innerHTML = pOptionHTML;
}
}
}
Beispiel zu innerHTML und die Select-Box