[jquery] Fancybox는 jQuery v1.9.0에서 작동하지 않습니다. [f.browser가 정의되지 않았습니다. / ‘msie’속성을 읽을 수 없습니다.]

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 구현이 실패합니다 !!



답변

여기에보고 된 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. text / html 편집기로 jquery.fancybox-1.3.4.js 파일 ( 팩 버전이 아닌 전체 버전)을 엽니 다 .
  2. 29 번 줄에서 다음과 같이 표시됩니다.

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

    과 (에 의해 대체 EDITED :보다 정확한 필터 2013년 3월 19일) :

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

    UPDATE (3 월 (19) 2013 년) : 또한 교체 $.browser.msienavigator.userAgent.match(/msie [6]/i)라인 (615)의 주위에 (그리고 / 또는 모든 대체 $.browser.msie감사가있는 경우 인스턴스를) joofow
    … 바로 그거야!

또는 여기에서 이미 패치 된 버전 다운로드하십시오 (2013 년 3 월 19 일 업데이트 됨 … 추가 닫는 괄호를 지적 해 주신 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.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>

귀하의 페이지와 작동합니다.


답변

글로벌 이벤트도 더 이상 사용되지 않습니다.

다음은 브라우저 및 이벤트 문제를 수정하는 패치입니다.

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


답변

누군가 여전히 jQuery 3.0 이상으로 레거시 fancybox를 지원해야하는 경우 다음과 같은 다른 변경 사항을 적용해야합니다.

.unbind () 지원 중단됨

의 모든 인스턴스를 다음 .unbind으로 바꾸기.off

.removeAttribute ()는 함수가 아닙니다.

.removeAttr()대신 jQuery를 사용하도록 580-581 행을 변경하십시오 .

이전 코드 :

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

새 코드 :

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

이것은 위에서 언급 한 다른 패치와 결합되어 내 호환성 문제를 해결했습니다.


답변