Подтвердить что ты не робот

Fancybox не работает с jQuery v1.9.0 [f.browser is undefined/Невозможно прочитать свойство msie ']

Fancybox разбивается с новым jQuery v1.9.0.

Это влияет как на Fancybox v1.3.4, так и ниже - и - v2.1.3 и ниже.

Показанные ошибки:

v1.3.4:

Timestamp: 15/01/2013 10:03:28 AM
Error: TypeError: b.browser is undefined
Source File: ...fancybox/jquery.fancybox-1.3.4.pack.js
Line: 18

... другие ошибки

Uncaught TypeError: Cannot read property 'msie' of undefined jquery.fancybox-1.3.4.pack.js:18
Uncaught TypeError: Object [object Object] has no method 'fancybox'

В версии 2.1.3:

Timestamp: 15/01/2013 10:09:58 AM
Error: TypeError: $.browser is undefined
Source File: h.../fancybox2.1.3/jquery.fancybox.js
Line: 139

Если вы используете это для вызова jQuery:

<script src="http://code.jquery.com/jquery-latest.js"></script>

... любая из существующих реализаций fancybox не сработает!

4b9b3361

Ответ 1

Кажется, что существует ошибка в jQuery, представленная здесь: http://bugs.jquery.com/ticket/13183, которая разбивает Fancybox script.

Также проверьте https://github.com/fancyapps/fancyBox/issues/485.

В качестве обходного пути откат к jQuery v1.8.3, в то время как ошибка jQuery исправлена ​​или Fancybox исправлен.


UPDATE (16 января 2013 г.): Fancybox v2.1.4 был выпущен, и теперь он отлично работает с jQuery v1.9.0.

Для fancybox v1.3.4 - вам все равно нужно откат до jQuery v1.8.3 или применить миграция script, как указано в ответе @Manu.


UPDATE (17 января 2013 г.): Обходной путь для пользователей Fancybox v1.3.4:

Запустите файл fancybox js, чтобы он работал с jQuery v1.9.0 следующим образом:

  • Откройте файл jquery.fancybox-1.3.4.js(полная версия, не пакетная версия) с помощью редактора text/html.
  • Найдите вокруг строки 29, где говорится:

    isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
    

    и замените его на EDITED 19 марта 2013 года: более точный фильтр):

    isIE6 = navigator.userAgent.match(/msie [6]/i) && !window.XMLHttpRequest,
    

    UPDATE (19 марта 2013 г.): Также замените $.browser.msie на navigator.userAgent.match(/msie [6]/i) на строку 615 (и/или замените все экземпляры $.browser.msie, если они есть), спасибо joofow ... что это!

Или загрузите уже исправленную версию fairylee для указания дополнительной закрывающей скобки)

ПРИМЕЧАНИЕ: это неофициальный патч и не поддерживается автором Fancybox, однако он работает так, как есть. Вы можете использовать его на свой страх и риск;)

По желанию вы можете скорее откатиться к jQuery v1.8.3 или применить миграция script, как указано в ответе @Manu.

Ответ 2

Привет, это связано с новой версией jQuery = > 1.9.0

вы можете проверить обновление: http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/

jQuery.Browser устарел. вы можете сохранить последнюю версию, добавив миграцию script: http://code.jquery.com/jquery-migrate-1.0.0.js

заменить:

<script src="http://code.jquery.com/jquery-latest.js"></script>

:

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.0.0.js"></script>

на вашей странице и ее работе.

Ответ 3

Глобальные события также устарели.

Вот патч, который исправляет проблемы браузера и событий:

--- jquery.fancybox-1.3.4.js.orig   2010-11-11 23:31:54.000000000 +0100
+++ jquery.fancybox-1.3.4.js    2013-03-22 23:25:29.996796800 +0100
@@ -26,7 +26,9 @@

        titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),

-       isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
+       isIE = !+"\v1",
+       
+       isIE6 = isIE && window.XMLHttpRequest === undefined,

        /*
         * Private methods 
@@ -322,7 +324,7 @@
            loading.hide();

            if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {
-               $.event.trigger('fancybox-cancel');
+               $('.fancybox-inline-tmp').trigger('fancybox-cancel');

                busy = false;
                return;
@@ -389,7 +391,7 @@
                        content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish);
                    };

-                   $.event.trigger('fancybox-change');
+                   $('.fancybox-inline-tmp').trigger('fancybox-change');

                    content
                        .empty()
@@ -612,7 +614,7 @@
            }

            if (currentOpts.type == 'iframe') {
-               $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
+               $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + (isIE ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
            }

            wrap.show();
@@ -912,7 +914,7 @@

        busy = true;

-       $.event.trigger('fancybox-cancel');
+       $('.fancybox-inline-tmp').trigger('fancybox-cancel');

        _abort();

@@ -957,7 +959,7 @@
            title.empty().hide();
            wrap.hide();

-           $.event.trigger('fancybox-cleanup');
+           $('.fancybox-inline-tmp, select:not(#fancybox-tmp select)').trigger('fancybox-cleanup');

            content.empty();

Ответ 4

В случае, если кто-то еще должен поддерживать устаревший fancybox с jQuery 3.0+, вот некоторые другие изменения, которые вам придется сделать:

.unbind() устарел

Замените все экземпляры .unbind на .off

.removeAttribute() не является функцией

Измените строки 580-581, чтобы вместо этого использовать jQuery .removeAttr():

Старый код:

580: content[0].style.removeAttribute('filter');
581: wrap[0].style.removeAttribute('filter');

Новый код:

580: content.removeAttr('filter');
581: wrap.removeAttr('filter');

В сочетании с другим исправлением, упомянутым выше, были решены проблемы с совместимостью.