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

100

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'

В v2.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 не удастся !!

JFK
источник
27
Вот почему вы никогда не должны использовать его jquery-latest.jsв производстве!
jrummell
1
используйте последнюю версию fancybox 2.1.5 fancyapps.com/fancybox
Мукеш

Ответы:

199

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

Также проверьте https://github.com/fancyapps/fancyBox/issues/485 для получения дополнительной информации.

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


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

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


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

Патч - файл FancyBox Js , чтобы заставить его работать с JQuery v1.9.0 как следующим образом :

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

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

    и замените его на ( ИЗМЕНИТЬ 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 ... вот оно!

Или скачайте уже исправленную версию ЗДЕСЬ (ОБНОВЛЕНО 19 марта 2013 г. ... спасибо Fairylee за указание на дополнительную закрывающую скобку)

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

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

JFK
источник
1
У меня возникла такая же проблема после извлечения из CDN API библиотек Google Ajax по адресу ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js . Это подтягивает последнюю версию jQuery 1.9.0, и проблема возникает. Мы сняли выпуск v1.8.3 и указали на него на локальном веб-сервере, и теперь все исправлено. Очевидно, мы хотели бы использовать CDN, но не за счет нарушения работы наших ползунков и всплывающих меню.
JPC
Почему написано регулярное выражение /msie [6]/i? - Класс символа [6]в точности эквивалентен символу 6 , то есть без скобок. Это не внушает особого доверия к коду…: /
zrajm
1
@ZrajmCAkfohg: Полагаю, потому что я обычно проверяю версии IE с 6 по 8, [6-8]и в этом случае все прошло так [6], как в конце - просто синтаксическое соглашение. В любом случае, если они «точно эквивалентны», то как это повлияет на доверие к коду?!?! Если результат с квадратными скобками или без них был другим, и это вызывает путаницу, я бы согласился с вами, иначе я не считаю ваш комментарий «... не внушает доверия ...» очень конструктивным. Я бы посоветовал вам опубликовать свой собственный «внушающий доверие» ответ.
JFK
1
Это не решает проблемы с открытием FancyBox во второй раз ... См. Этот образец страницы здесь: wasen.net/testjq1.10.2.html
Андерс
1
@basZero: это совершенно разные вопросы. Для того, что вы описываете, проверьте groups.google.com/forum/#!topic/fancybox/-re22BoXOzM, если это поможет
JFK
28

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

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

jQuery.Browser устарел. вы можете сохранить последнюю версию, добавив скрипт миграции: 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>

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

Ману
источник
+1 Интересно. В любом случае мы все должны отредактировать наши системы, чтобы выполнить либо откат версии, либо применить исправление для устаревшего кода.
JFK
Применение патча (jquery-migrate) не помогает решить эту проблему с fancybox-1.3.4, jquery-1.11.3 и jquery-migrate-1.2.1 ... Существуют ли какие-либо исправления для этого без необходимости обновления на платный Fancybox2?
basZero
19

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

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

--- 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
С инструкциями по исправлению только из ответа JFK у меня все еще были проблемы, когда я пытался открыть встроенный ящик во второй раз, всегда отображая сообщение об ошибке «Запрошенный контент не может быть загружен. Повторите попытку позже». вместо содержимого, которое было правильно отображено с первой попытки. Используя ваши (не столь очевидные) дополнительные патчи, он наконец заработал.
Gurken Papst
1
Просто попробовал это решение с jQuery 1.10.2, и, похоже, оно работает. Хотя я также согласен с тем, что понять «патч» в этом ответе не очевидно.
Daze
Это отличное решение для тех, кто застрял на старой версии Fancybox, и кому нужна новая версия JQuery. Исправлены некоторые очень сложные ошибки, с которыми я столкнулся.
glenatron
4
Если у кого-то
возникнут
4

Если кому-то все еще нужно поддерживать устаревший fancybox с jQuery 3.0+, вам необходимо внести еще несколько изменений:

.unbind () устарел

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

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

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

Старый код:

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

Новый код:

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

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

Robert_QSS
источник
Как бы вы исправили это утверждение? b.showNavArrows? ((b.cyclic && 1 <h.length || 0! == s) && y.show (), (b.cyclic && 1 <h.length || s! = h.length-1) && z.show ( )) :( y.hide (), z.hide ())}, M = function () {a.support.opacity || (p.get (0) .style.removeAttribute ("фильтр"), f. get (0) .style.removeAttribute ("filter"))
Knocks X