Fancybox nie działa z jQuery v1.9.0 [f.browser jest niezdefiniowana / Nie można odczytać właściwości „msie”]

100

Fancybox zrywa z nowym jQuery v1.9.0.

Dotyczy to zarówno wersji Fancybox 1.3.4 i starszych - jak i wersji 2.1.3 i starszych.

Wyświetlane błędy to:

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

... inne błędy

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'

W wersji 2.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

Jeśli używasz tego do wywoływania jQuery:

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

... żadna z Twoich istniejących implementacji Fancybox nie powiedzie się !!

JFK
źródło
27
I dlatego nigdy, przenigdy nie powinieneś używać jquery-latest.jsw produkcji!
jrummell
1
użyj najnowszej wersji fancybox 2.1.5 fancyapps.com/fancybox
Mukesh

Odpowiedzi:

199

Wygląda na to, że istnieje błąd w jQuery zgłoszony tutaj: http://bugs.jquery.com/ticket/13183, który łamie skrypt Fancybox.

Sprawdź również https://github.com/fancyapps/fancyBox/issues/485, aby uzyskać dalsze informacje.

Aby obejść ten problem , wycofaj się do jQuery v1.8.3, gdy błąd jQuery został naprawiony lub Fancybox jest załatany.


UPDATE (16 stycznia 2013): Fancybox v2.1.4 został wydany i teraz działa dobrze z jQuery v1.9.0.

W przypadku fancybox v1.3.4 - nadal musisz przywrócić jQuery v1.8.3 lub zastosować skrypt migracji, jak wskazuje odpowiedź @ Manu.


UPDATE (17 stycznia 2013 r.): Obejście dla użytkowników Fancybox v1.3.4 :

Załatać plik js fancybox , aby pracować z jQuery v1.9.0, co następuje:

  1. Otwórz plik jquery.fancybox-1.3.4.js (pełna wersja, nie wersja spakowana ) za pomocą edytora text / html.
  2. Znajdź wokół linii 29, gdzie jest napisane:

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

    i zamień go na ( ZMIENIONO 19 marca 2013: dokładniejszy filtr):

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

    UPDATE (19 marca 2013): zastąpić także $.browser.msieprzez navigator.userAgent.match(/msie [6]/i)około linii 615 (i / lub wymienić wszystkie $.browser.msieinstancje, jeśli w ogóle), dzięki joofow ... to jest to!

Lub pobierz już poprawioną wersję TUTAJ (AKTUALIZACJA 19 marca 2013 ... dzięki, wróżka za wskazanie dodatkowego nawiasu zamykającego)

UWAGA : jest to nieoficjalna łatka i nie jest obsługiwana przez autora Fancybox, jednak działa tak, jak jest. Możesz go używać na własne ryzyko;)

Opcjonalnie możesz raczej cofnąć się do jQuery v1.8.3 lub zastosować skrypt migracji, jak wskazuje odpowiedź @ Manu.

JFK
źródło
1
Miałem ten sam problem po ściągnięciu z Google Ajax Libraries API CDN na stronie ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js . Powoduje to ściągnięcie najnowszej wersji jQuery 1.9.0 i pojawia się problem. Wyciągnęliśmy wersję v1.8.3 i wskazaliśmy ją na lokalnym serwerze WWW i wszystko zostało już naprawione. Oczywiście chcielibyśmy używać CDN, ale nie kosztem łamania naszych suwaków i menu podręcznych.
JPC
Dlaczego zapisywane jest wyrażenie regularne /msie [6]/i? - Klasa znaku [6]jest dokładnie równoważna znakowi 6 , tj. Bez nawiasów. To nie wzbudza zbytniego zaufania do kodu…: /
zrajm
1
@ZrajmCAkfohg: Chyba dlatego, że normalnie sprawdzam wersje IE od 6 do 8 [6-8]iw tym przypadku poszło tak [6], jak na końcu jest po prostu konwencja składni. W każdym razie, jeśli są one „dokładnie równoważne”, to jak wpływa to na zaufanie do kodu?!?! Gdyby wynik z nawiasami lub bez był inny i stwarzało to miejsce na nieporozumienia, zgodziłbym się z Tobą, w przeciwnym razie nie widzę Twojego komentarza „… nie budzi zaufania…” bardzo konstruktywnego. Wolałbym zachęcić Cię do zamieszczenia własnej odpowiedzi „budzącej zaufanie”.
JFK,
1
Nie rozwiązuje to jednak problemu z otwarciem FancyBox po raz drugi ... Zobacz tę przykładową stronę tutaj: wasen.net/testjq1.10.2.html
Anders
1
@basZero: to są zupełnie inne kwestie. W przypadku tego, który opisujesz, sprawdź groups.google.com/forum/#!topic/fancybox/-re22BoXOzM, jeśli to pomoże
JFK,
28

Cześć, wynika to z nowej wersji jQuery => 1.9.0

możesz sprawdzić aktualizację: http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/

jQuery.Browser jest przestarzała. możesz zachować najnowszą wersję, dodając skrypt migracji: http://code.jquery.com/jquery-migrate-1.0.0.js

zastąpić :

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

przez :

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

na twojej stronie i działa.

Manu
źródło
+1 ciekawe. W każdym razie wszyscy musimy edytować nasze systemy, aby albo cofnąć wersję, albo zastosować poprawkę dla starszego kodu.
JFK,
Zastosowanie poprawki (jquery-migrate) nie pomaga w rozwiązaniu tego problemu z fancybox-1.3.4, jquery-1.11.3 i jquery-migrate-1.2.1 ... Czy są jakieś rozwiązania tego problemu bez konieczności aktualizacji do non-free Fancybox2?
basZero
19

Zdarzenia globalne również są przestarzałe.

Oto łatka, która rozwiązuje problemy z przeglądarką i zdarzeniami:

--- 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
źródło
4
Przy samych instrukcjach łatania z odpowiedzi JFK nadal miałem problemy, gdy próbowałem otworzyć skrzynkę wbudowaną po raz drugi, zawsze pokazując komunikat o błędzie „Żądana zawartość nie może zostać załadowana. Spróbuj ponownie później”. zamiast treści, która została poprawnie wyświetlona za pierwszym razem. Używając twoich (nie tak oczywistych) dodatkowych łatek w końcu działa.
Gurken Papst
1
Właśnie wypróbowałem to rozwiązanie z jQuery 1.10.2 i wydaje się, że działa. Chociaż zgadzam się również, nie jest oczywiste, że rozumiem „poprawkę” w tej odpowiedzi.
Daze
Jest to świetne rozwiązanie dla każdego, kto utknął w starej wersji Fancybox i potrzebuje nowej wersji JQuery. Naprawiono kilka bardzo kłopotliwych błędów, na które się natknąłem.
glenatron
4
Jeśli ktoś ma problem z zastosowaniem łatki, oto plik z poprawkami: pastebin.com/9R2VFVBQ
dloewen
4

Na wypadek, gdyby ktoś nadal musiał obsługiwać starszą wersję Fancybox z jQuery 3.0+, oto kilka innych zmian, które musisz wprowadzić:

.unbind () jest przestarzały

Zastąpić wszystkie wystąpienia .unbindz.off

.removeAttribute () nie jest funkcją

Zmień wiersze 580-581, aby .removeAttr()zamiast tego używać jQuery :

Stary kod:

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

Nowy kod:

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

To w połączeniu z inną wspomnianą powyżej poprawką rozwiązało moje problemy ze zgodnością.

Robert_QSS
źródło
Jak naprawiłbyś to stwierdzenie? 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 ("filtr"), f. get (0) .style.removeAttribute ("filter"))
Puka X