Fancybox не работает с jQuery v1.9.0 [f.браузер не определен / не может прочитать свойство "msie"]
fancybox разрывается с новым jQuery v1.9.0.
это влияет на оба, Fancybox v1.3.4 и ниже - и-v2.1.3 и ниже.
показаны следующие ошибки:
В1.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 потерпит неудачу!!
4 ответов
похоже, что существует ошибка в jQuery, сообщенная здесь : http://bugs.jquery.com/ticket/13183 это нарушает сценарий Fancybox.
также проверить https://github.com/fancyapps/fancyBox/issues/485 для дальнейшего ознакомления.
в качестве обходного пути откат к в jQuery версии v1.8.3 пока Исправлена ошибка jQuery или Fancybox исправленный.
обновление (16 Января 2013): Fancybox П2.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 как следовать:
- открыть с помощью jQuery.fancybox-1.3.4.js (полная версия, не Pack версии) С редактором текста / html.
-
найти вокруг линии 29, где говорится :
isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
и заменить его (редактировать 19 марта 2013: более точный filter):
isIE6 = navigator.userAgent.match(/msie [6]/i) && !window.XMLHttpRequest,
обновление (19 марта 2013): заменить
$.browser.msie
bynavigator.userAgent.match(/msie [6]/i)
по строке 615 (и/или заменить все$.browser.msie
экземпляры, если есть), спасибо joofow ... вот так!
или загрузите уже исправленную версию отсюда (обновлено 19 марта 2013 года ... спасибо fairylee для указания дополнительного закрывающего кронштейна)
Примечание: это неофициальный патч и не поддерживается автором Fancybox, однако он работает, как. Вы можете использовать его на свой страх и риск ;)
дополнительно, вы можете скорее откат к в jQuery версии v1.8.3 или применить миграция скрипт как указано в ответе @Manu.
Привет, это связано с новой версией jQuery => 1.9.0
вы можете проверить обновления : http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/
С помощью jQuery.Браузер устарел. последнюю версию можно сохранить, добавив сценарий миграции : http://code.jquery.com/jquery-migrate-1.0.0.js
заменить :
<script src="http://code.jquery.com/jquery-latest.js"></script>
by:
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.0.0.js"></script>
на странице и его рабочий.
глобальные события также устарели.
вот патч, который исправляет проблемы браузера и событий:
--- 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();
в случае, если кто-то все еще должен поддерживать legacy fancybox с jQuery 3.0+ вот некоторые другие изменения, которые вам придется сделать:
.unbind () deprecated
заменить все экземпляры .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');
это в сочетании с другой патч, упомянутый выше, решил мои проблемы совместимости.