Fancybox funktioniert nicht mit jQuery v1.9.0 [f.browser ist undefiniert / Eigenschaft 'msie' kann nicht gelesen werden]

100

Fancybox bricht mit der neuen jQuery v1.9.0.

Dies betrifft sowohl Fancybox v1.3.4 als auch darunter - und - v2.1.3 und darunter.

Die angezeigten Fehler sind:

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

... andere Fehler

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'

In 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

Wenn Sie damit jQuery aufrufen:

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

... jede Ihrer vorhandenen Fancybox-Implementierungen wird fehlschlagen !!

JFK
quelle
27
Und das ist , warum sollten Sie nie, nie verwenden jquery-latest.jsin der Produktion!
Jrummell
1
Verwenden Sie die neueste Version von Fancybox 2.1.5 Fancyapps.com/fancybox
Mukesh

Antworten:

199

Es scheint, dass es einen Fehler in jQuery gibt, der hier gemeldet wird: http://bugs.jquery.com/ticket/13183 , der das Fancybox-Skript beschädigt.

Weitere Informationen finden Sie unter https://github.com/fancyapps/fancyBox/issues/485 .

Um dieses Problem zu umgehen , führen Sie ein Rollback auf jQuery v1.8.3 durch, während entweder der jQuery-Fehler behoben oder Fancybox gepatcht ist.


UPDATE (16. Januar 2013): Fancybox v2.1.4 wurde veröffentlicht und funktioniert jetzt einwandfrei mit jQuery v1.9.0.

Für Fancybox v1.3.4- müssen Sie noch ein Rollback auf jQuery v1.8.3 durchführen oder das Migrationsskript anwenden, wie in der Antwort von @ Manu angegeben.


UPDATE (17. Januar 2013): Problemumgehung für Benutzer von Fancybox v1.3.4 :

Patchen Sie die Fancybox-JS-Datei , damit sie mit jQuery v1.9.0 wie folgt funktioniert:

  1. Öffnen Sie die Datei jquery.fancybox-1.3.4.js (Vollversion, keine Packversion ) mit einem Text- / HTML-Editor.
  2. Finden Sie in der Zeile 29, wo steht:

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

    und ersetzen Sie es durch ( EDITED 19. März 2013: genauerer Filter):

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

    UPDATE (19. März 2013): Ersetzen Sie auch $.browser.msiedurch navigator.userAgent.match(/msie [6]/i)Zeile 615 (und / oder ersetzen Sie alle $.browser.msieInstanzen, falls vorhanden), danke joofow ... das war's!

Oder laden Sie die bereits gepatchte Version von HIER herunter (AKTUALISIERT am 19. März 2013 ... danke fairylee für den Hinweis auf die zusätzliche schließende Klammer)

HINWEIS : Dies ist ein inoffizieller Patch, der vom Autor von Fancybox nicht unterstützt wird, jedoch wie er ist funktioniert. Sie können es auf eigenes Risiko verwenden;)

Optional können Sie lieber ein Rollback auf jQuery v1.8.3 durchführen oder das Migrationsskript anwenden, wie in der Antwort von @ Manu angegeben.

JFK
quelle
1
Ich hatte das gleiche Problem, nachdem ich es aus dem API-CDN der Google Ajax Libraries unter ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js abgerufen hatte . Dies zieht die neueste jQuery-Version von 1.9.0 und das Problem tritt auf. Wir haben die Version 1.8.3 heruntergezogen und auf dem lokalen Webserver darauf hingewiesen, und jetzt ist alles behoben. Natürlich möchten wir das CDN verwenden, aber nicht auf Kosten der Unterbrechung unserer Schieberegler und Hover-Menüs.
JPC
Warum ist der Regex geschrieben /msie [6]/i? - Die Zeichenklasse [6]entspricht genau dem Zeichen 6 , dh ohne die Klammern. Das
weckt
1
@ZrajmCAkfohg: Ich denke, weil ich normalerweise IE-Versionen von 6 bis 8 validiere [6-8]und in diesem Fall einfach so lief [6], ist am Ende nur eine Syntaxkonvention. Wie auch immer, wenn sie "genau gleichwertig" sind, wie wirkt sich das dann auf das Vertrauen in den Code aus?!?! Wenn das Ergebnis mit oder ohne Klammern anders wäre und dies Raum für Verwirrung schafft, würde ich Ihnen zustimmen, sonst sehe ich Ihren Kommentar "... schafft kein Vertrauen ..." überhaupt nicht als sehr konstruktiv an. Ich möchte Sie eher ermutigen, Ihre eigene "vertrauensinspirierende" Antwort zu veröffentlichen.
JFK
1
Dies behebt jedoch nicht das Problem beim zweiten Öffnen der FancyBox ... Siehe diese Beispielseite hier: wasen.net/testjq1.10.2.html
Anders
1
@basZero: Das sind ganz andere Themen. Für die, die Sie beschreiben, überprüfen Sie groups.google.com/forum/#!topic/fancybox/-re22BoXOzM, wenn das hilft
JFK
28

Hallo, das liegt an der neuen Version von jQuery => 1.9.0

Sie können das Update überprüfen: http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/

jQuery.Browser ist veraltet. Sie können die neueste Version beibehalten, indem Sie ein Migrationsskript hinzufügen: http://code.jquery.com/jquery-migrate-1.0.0.js

ersetzen:

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

durch :

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

in Ihrer Seite und es funktioniert.

Manu
quelle
+1 Interessant. In jedem Fall müssen wir alle unsere Systeme bearbeiten, um entweder eine Rollback-Version durchzuführen oder den Patch für Legacy-Code anzuwenden.
JFK
Das Anwenden des Patches (jquery-migrate) hilft nicht, dieses Problem mit Fancybox-1.3.4, jquery-1.11.3 und jquery-migrate-1.2.1 zu lösen. Gibt es Patch-Lösungen dafür, ohne dass ein Upgrade erforderlich ist? zur unfreien Fancybox2?
BasZero
19

Globale Ereignisse sind ebenfalls veraltet.

Hier ist ein Patch, der die Browser- und Ereignisprobleme behebt:

--- 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();
sabel
quelle
4
Allein mit den Patch-Anweisungen aus der Antwort von JFK hatte ich immer noch Probleme, als ich versuchte, ein Inline-Feld ein zweites Mal zu öffnen. Dabei wurde immer die Fehlermeldung "Der angeforderte Inhalt kann nicht geladen werden. Bitte versuchen Sie es später erneut." Anstelle des Inhalts wurde dieser beim ersten Versuch ordnungsgemäß angezeigt. Mit Ihren (nicht so offensichtlichen) zusätzlichen Patches funktioniert es endlich.
Gurken Papst
1
Ich habe diese Lösung gerade mit jQuery 1.10.2 ausprobiert und sie scheint zu funktionieren. Obwohl ich auch zustimme, ist es nicht offensichtlich, den "Patch" in dieser Antwort zu verstehen.
Benommenheit
Dies ist eine großartige Lösung für alle, die eine alte Version von Fancybox verwenden und eine neue Version von JQuery benötigen. Einige sehr verwirrende Fehler wurden behoben, auf die ich stieß.
Glenatron
4
Wenn jemand Probleme der Anwendung des Patch hat, dann ist hier die Datei mit Änderungen: pastebin.com/9R2VFVBQ
dloewen
4

Falls noch jemand Legacy Fancybox mit jQuery 3.0+ unterstützen muss, müssen Sie einige weitere Änderungen vornehmen:

.unbind () veraltet

Ersetzen Sie alle Instanzen von .unbinddurch.off

.removeAttribute () ist keine Funktion

Ändern Sie die Zeilen 580-581, um .removeAttr()stattdessen jQuery's zu verwenden:

Alter Code:

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

Neuer Code:

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

Dies in Kombination mit dem anderen oben genannten Patch löste meine Kompatibilitätsprobleme.

Robert_QSS
quelle
Wie würden Sie diese Aussage korrigieren? 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"))
Knocks X