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'

У версії 2.1:

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>

... будь-яка з ваших існуючих модних реалізацій не вдасться !!


27
І тому ви ніколи не повинні ніколи використовувати jquery-latest.jsу виробництві!
jrummell

1
використовуйте останню версію fancybox 2.1.5 fancyapps.com/fancybox
Mukesh

Відповіді:


199

Схоже, існує помилка в jQuery, про яку повідомляється тут: http://bugs.jquery.com/ticket/13183, що порушує сценарій Fancybox.

Також перевірте https://github.com/fancyapps/fancyBox/isissue/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 або застосувати сценарій міграції, як зазначено у відповіді @ Ману.


1
У мене виникла така ж проблема після витягування з CDN Google Ajax Libraries CDN за адресою 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 вдруге, хоча ... Дивіться цю прикладну
Anders

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 у мене були проблеми, коли я вдруге намагався відкрити вкладене поле, завжди показуючи повідомлення про помилку "Запитаний вміст не може бути завантажено. Будь ласка, спробуйте пізніше". замість вмісту, який був правильно відображений з першої спроби. Використовуючи свої (не настільки очевидні) додаткові патчі, нарешті це спрацює.
Гуркен Папст

1
Щойно спробував це рішення з jQuery 1.10.2 і, здається, працює. Хоча я також погоджуюся, що зрозуміти "патч" у цій відповіді очевидно.
Daze

Це чудове рішення для тих, хто стикається зі старою версією Fancybox, якій потрібна нова версія JQuery. Виправлені деякі дуже неприємні помилки, в які я зіткнувся.
Гленатрон

4
Якщо у когось є проблеми із застосуванням патча, ось файл із правками: pastebin.com/9R2VFVBQ
dloewen

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');

Це в поєднанні з іншим вищезгаданим патчем вирішило мої проблеми сумісності.


Як би ви виправили це твердження? 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 = функція () {a.support.opacity || (p.get (0) .style.removeAttribute ("фільтр"), f. get (0) .style.removeAttribute ("filter"))
стукає X
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.