Лучшее – враг хорошего
Das Gespenst ist auf dem Drachenklo
Das Drachenklo ist im Monsterschloss
Das Monsterschloss ist in der Gespensterburg
Die Gespensterburg liegt in Dixiland
Dixiland liegt in Deutschland
Deutschland ist auf der Gespenstererde,
Und die Gespenstererde ist im Monsteruniversum !
Нетленка моего детства. Навеяло. ;-)
Сегодня нашёл замечательные грабли. Даже маленькие детишки знают, что элементы выпадающих меню/списков DHTML-форм можно изменять. Большинство делает это крестьянским способом:
stateelem = document.getElementById("state");
stateelem.options[0] = new Option("",""); // типа добавили пустой элемент в первую позицию, мы малатцы
Но, в один прекрасный момент, выясняется, что модуль, в котором есть такой кусок, не работает в Safari. Лезем в сафарий конфиг, активируем отладку, смотрим – показывает содержательное “DOM Exception 8″. Гуглим. На свет Божий появляется *.h файл от Konqueror’а, в котором снизошли до объяснений, лаконичных правда – OBJ_NOT_FOUND. И то приятно.
Смотрим на объект. На код. На объект. На код. Вроде бы всё на месте – id, name. Причем явно объект существующий – потому как window.debug.log выводит верное его значение. Из окна стал виден сумасшедший дом. Однако, обращаем внимание на тот факт, что мы были хорошими мальчиками и девочками и не поленились, вставили в наш <select> разметку <optgroup>, как завещает нам WAI и Section 508. Тут-то собачка и порылась.
Выясняется, что Safari пытается строить из себя честную католичку, и, при использовании крестьянского метода работы с <select>, преобразует вызов свойства options даннного объекта где-то внутри себя в DOM-совместимый (т.е. appendChild, firstChild и т.п.). При этом полагает, что <option> будет первым дочерним объектом для <select>. А наши <optgroup> в реальности встают в иерархии в промежутке между <select> и <option> (почти как эпиграфе ;-) ), поэтому ничего не работает. Прочие браузеры на такие мелочи жизни не обращают внимания. Я уж промолчу про известный ее глюк с рендерингом динамических меню, когда психоделика так и прёт из-под курсора.
Вроде так…