Ода Ослиному Упорству.
Обожаю майкрософт!
Довелось мне тут по работе столкнуться с одной задачкой. Мой заказчик решил на своем сайте сделать окно приветствия — когда пользователь заходит на страницу регистрации, должно появиться всплывающее окно, в котором владелец сайта приветствует новоприбывшего будущего пользователя его ресурса.
И для этой незамысловатой цели он выбрал достаточно простую и удобную библиотеку iBox (http://www.ibegin.com/labs/ibox/. Она представляет собой кусок кода на JavaScript, который только то и делает, что генерит разнообразные всплывающие окошки. Кстати, довольно красивые и функциональные. Размер библиотеки — чуть больше 20 килобайт. В использовании простая как две копейки.
Ну так вот, соорудил он, значит, HTML-файл с приветствием, и вставил в код страницы регистрации такой вызов:
<body onLoad="iBox.showURL('welcome.html','block','block')">
Суть проста: как только страница загрузилась — окно выпрыгнуло, как чертик из табакерки.
Код он вставил и решил проверить. Запустил — работает! Окно исправно появляется, все красиво и правильно.
Но, как и любой житель буржуинии (а заказчик — американец), он помешан на всяких там совместимостях, соответствиях стандартам и прочей подобной фигне. Поэтому он решил опробовать свое творение в различных броузерах.
Opera, Safari и FireFox показали одинаково красивые результаты. Но это американца не успокоило — надо же попробовать и на "флагмане ИТ-индустрии" - Internet Explorer'е. Ну и конечно тут возникла проблема. Точнее даже две.
Первая достаточно простая — найти тот самый интернет эксплорер (в простонародье - "ишак"). Дело в том, что, как и многие нормальные иностранцы, этот товарищ работает на макинтоше и, естественно, ишака там нет. Там сафари — всё умеет, со всем совместим, всё поддерживает и все им довольны.
Вторая проблема посерьезнее — когда он все же нашел машину с виндой, выяснилось, что в ишаке окно почему-то не выпрыгивает. Более того, сам ишак матерится на какую-то ошибку, толком не говоря, какую именно. Будто бы это военная тайна.
Собственно с этой проблемой американец и обратился ко мне.
Не буду рассказывать как я убивал час за часом пытаясь выяснить, что именно майкрософтовскому детищу не нравится и какие слова при этом из меня выходили — вы и сами догадаетесь. Скажу лишь, что подружить iBox с IE 6 мне так и не удалось.
Но причину такого упорного нежелания работать мне все же удалось выяснить.
Дело в следующем. Перед использованием функционала iBox, этой библиотеке нужно что-то там внутри себя проинициализировать. И в процессе инициализации она заранее создает несколько div'ов , которые позже используются для построения разных окошек. Но, как все вы знаете, DIV'ы можно создать только после того, как DOM страницы полностью загружена.
Как отловить этот момент? Правильно — привязаться событию onLoad тэга . Но ведь на этом же событии у нас уже висит обработчик, который поставил заказчик....
Ситуация такова: все нормальные броузеры начинают обрабатывать JavaScript-код (загруженный в секции
нашей HTML-страницы) ПЕРЕД обработкой самой страницы. Поэтому код iBox в них прикрепляется в очередь обработчиков первым — до нашего iBox.showURL. Соответственно и выполняется он раньше нашего вызова. Таким образом получается, что, к моменту вызова iBox.showURL, библиотека уже проинициализирована и готова к работе.Ишак же делает все наоборот — сперва пытается обработать наш вызов (и получает ошибку ведь компоненты библиотеки еще не готовы к работе), а уж потом проинициализировать саму библиотеку. Такой вот нелепый финт ушами. Никакие попытки обойти или изменить это поведение не привели к успеху, ишак — он и в африке ишак.
Итог: убито несколько часов, выпито много кофе, высказано много лестного в адрес Билла и компании, и лишний раз укреплена уверенность в том, что мелкомягкие думают задним местом, через которое у них потом все и работает.