Ода Ослиному Упорству.

Обожаю майкрософт!

Довелось мне тут по работе столкнуться с одной задачкой. Мой заказчик решил на своем сайте сделать окно приветствия — когда пользователь заходит на страницу регистрации, должно появиться всплывающее окно, в котором владелец сайта приветствует новоприбывшего будущего пользователя его ресурса.

И для этой незамысловатой цели он выбрал достаточно простую и удобную библиотеку 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, библиотека уже проинициализирована и готова к работе.

Ишак же делает все наоборот — сперва пытается обработать наш вызов (и получает ошибку ведь компоненты библиотеки еще не готовы к работе), а уж потом проинициализировать саму библиотеку. Такой вот нелепый финт ушами. Никакие попытки обойти или изменить это поведение не привели к успеху, ишак — он и в африке ишак.

Итог: убито несколько часов, выпито много кофе, высказано много лестного в адрес Билла и компании, и лишний раз укреплена уверенность в том, что мелкомягкие думают задним местом, через которое у них потом все и работает.


25 сентября 2008, 18:48
Есть решение
По работе очень часто сталкивался с этим, с последовательностью событий. Все проблемы исчезли после того, как познакомился с YUI.
Там есть такие функции.
YAHOO.util.Event.onDOMReady(myFunction);
YAHOO.util.Event.onAvailable(elementID, myFunction);
YAHOO.util.Event.onContentReady(elementID, myFunction);
Благодаря им, все проблемы с последовательностью выполнения событий исчезли.
На ibox не смотрел (сайт не грузится), но можно было бы сделать что-то вроде
YAHOO.util.Event.onDOMReady(initializeIBOX);
Незаменимая библиотека при создании более сложных скриптов.

xXx =email=
25 сентября 2008, 19:00
Пример
А вот, собственно, пример на YUI (приветствие посетителя)
http://webpeppers.ru/examples/yui/dialog2.html

xXx =email=
Я сейчас смотрю в сторону jQuery. Пока вроде все устраивает. А iBox - проект молодой и пока сыроват. Просто заказчику он чем-то сильно понравился.
Admin of fit-media.com

Адрес заметки: http://fit-media.com/post_1221685017.html


Если вы не можете отправить комментарий, то прочтите как это исправить здесь

Обязательные для заполнения поля помечены карандашом.


Ваш комментарий к статье:
cod

email при указании не будет опубликован.
Адреса с http:// преобразуются в ссылки автоматически.
Для этого отделяйте их от текста ПРОБЕЛАМИ с обеих концов.
Теги запрещены.

Этот сайт полностью окупает себя, хотя его ТИЦ=10, а PR=2. Хотите знать, как он это делает? Хотите чтобы Ваш сайт чарез пол-часа тоже начал на полном автопилоте приносить деньги?
Регистрируйся здесь и здесь и начинай получать деньги со своего сайта!