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实施都会失败!


27
这就是为什么您永远都不要jquery-latest.js在生产中使用它!
jrummell

1
使用最新版本的fancybox 2.1.5 fancyapps.com/fancybox
Mukesh,

Answers:


199

看来它存在jQuery的一个错误,报告这里:http ://bugs.jquery.com/ticket/13183,它破坏了Fancybox脚本。

另请检查https://github.com/fancyapps/fancyBox/issues/485以获取更多参考。

解决方法是在修复jQuery错误或修复Fancybox的同时回滚到jQuery v1.8.3


更新(2013年1月16日):Fancybox v2.1.4已发布,现在可以与jQuery v1.9.0一起正常使用。

对于fancybox v1.3.4-,您仍然需要回滚到jQuery v1.8.3或应用@Manu的答案指出的迁移脚本


更新(2013年1月17日):Fancybox v1.3.4用户的解决方法:

修补fancybox js文件以使其与jQuery v1.9.0兼容,如下所示:

  1. 使用文本/ html编辑器打开jquery.fancybox-1.3.4.js文件(完整版,而非压缩)。
  2. 在第29行发现:

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

    并替换为(2013年3月19日编辑:更准确的过滤器):

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

    UPDATE(2013年3月19日):也取代$.browser.msie通过navigator.userAgent.match(/msie [6]/i)各地线615(和/或更换所有$.browser.msie的情况下,如果有的话),感谢joofow ......就是这样!

从此处下载已经打补丁的版本(2013年3月19日更新...感谢fairylee指出了额外的结束括号)

注意:这是一个非官方的修补程序,Fancybox的作者不支持此修补程序,但是它按原样工作。您可以自担风险使用它;)

(可选)您可以回滚到jQuery v1.8.3或应用@Manu的答案指出的迁移脚本


1
ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js从Google Ajax库API CDN中提取后,我遇到了同样的问题。这拉出了最新的jQuery 1.9.0版本,问题浮出水面。我们拉下了v1.8.3发行版,并在本地Web服务器上指向它,现在一切都已修复。显然,我们想使用CDN,但不以破坏滑块和悬停菜单为代价。
JPC

为什么要写正则表达式/msie [6]/i?-字符类[6]完全等同于字符 6,即没有括号。这并不会激发人们对代码的信心……:/
zrajm

1
@ZrajmCAkfohg:我猜是因为我通常会验证IE版本从6到8 [6-8],在这种情况下,它只是作为[6],所以最后只是一种语法约定。无论如何,如果它们“完全等效”,那么这将如何影响代码的可信度?!?!如果带括号或不带括号的结果有所不同,这会使您感到困惑,那么我会同意您的意见,否则,我不会看到您的“……没有激发信心……”的评论完全具有建设性。我希望您发布自己的“激发信心”的答案。
肯尼迪国际

1
但这并不能解决第二次打开FancyBox的问题……在此处查看此示例页面:wasen.net/testjq1.10.2.html
Anders

1
@basZero:这是完全不同的问题。如果您描述的话,请查看groups.google.com/forum /#!topic / fancybox / -re22BoXOzM(如果有帮助的话)
JFK 2015年

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有趣。无论如何,我们所有人都必须编辑我们的系统以执行回滚版本或将补丁应用于旧代码。
肯尼迪国际

应用补丁(jquery-migrate)不能解决fancybox-1.3.4,jquery-1.11.3和jquery-migrate-1.2.1的问题。是否有任何补丁解决方案而无需升级到非免费的Fancybox2吗?
2015年

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尝试了此解决方案,它似乎可以工作。尽管我也同意,但在此答案中理解“补丁”并不明显。
呆子

对于那些坚持使用旧版本的Fancybox并需要新版本的JQuery的人来说,这是一个很好的解决方案。修复了我遇到的一些非常令人困惑的错误。
glenatron 2014年

4
如果有人在应用补丁程序时遇到问题,请使用以下文件进行编辑:pastebin.com/9R2VFVBQ
dloewen 2014年

4

如果仍然有人需要使用jQuery 3.0+支持旧式fancybox,则还需要进行其他一些更改:

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

结合上面提到的其他补丁解决了我的兼容性问题。


您将如何修正此陈述?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(“ filter”),f。 get(0).style.removeAttribute(“ filter”))
敲X
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.