Metrika

27 января 2011 г.

Проблема с событием onload в объекте Image в браузере Opera

Наткнулся на проблему при использовании плагина для jQuery lightbox 0.5. В Opera 11.00 - при нажатии на ссылку, которая должна отобразить фотографию, открывался оверлей, но фотография не отображалась. Если закрыть оверлей и снова нажать на туже ссылку, то фотография отображалась нормально.
Начал копаться в коде lightbox. Выяснил, что проблема в том, что в функции _set_image_to_view() из файла jquery.lightbox-0.5.js устанавливается обработчик события onload на объект Image, внутри обработчика выполняется отображение фотографии:
objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };
Но после загрузки фотографии обработчик onload не запускается.
Поскольку в других браузерах все работало отлично, понял, что проблема в Opera. Погуглив нашел несколько постов в форумах на эту тему:
Решения не нашел, поэтому сделал такую заплатку: в функцию  _set_image_to_view() из файла jquery.lightbox-0.5.js после строк:
            // Image preload process
            var objImagePreloader = new Image();
           
            objImagePreloader.onload = function () {
                $('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
                // Perfomance an effect in the image container resizing it
                _resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
                //    clear onLoad, IE behaves irratically with animated gifs otherwise
                objImagePreloader.onload = function () { };
            };

            objImagePreloader.src = settings.imageArray[settings.activeImage][0];

добавил:

            if (window.opera) {
                var ver = window.opera.version();
                if (ver == '11.00' || ver == '11.01' || ver == '7.50' || var == '7.54') {
                    ___pause(1000);
                    objImagePreloader.onload();
                }
            }

Функция  ___pause определена в файле jquery.lightbox-0.5.js. Значение задержки надо подобрать в зависимости от скорости загрузки фотографий. В общем 100% результат не гарантирован, т.к. скорость загрузки всегда разная.
Решение не очень красивое, но другого не придумал :)

Комментариев нет :

Отправить комментарий