2010-05-26 4 views
6

Firefox에서 완벽하게 작동하지만 IE에서 오류가 발생하는 페이지가 있습니다. jQuery를 동적으로로드하고 (아직로드되지 않은 경우) jQuery (document) .ready() 블록에서 일부 작업을 수행하고있다. 그러나 IE는 jQuery (document) .ready() 블록을 쳤을 때 두려운 "Object expected"오류를 throw합니다.IE7 jQuery (document) .ready() 문제

당신은 여기에 전체 페이지 코드를 볼 수 있습니다 http://www.pastie.org/977767

IE 바로 jQuery를 (문서) .ready에서 오류를 던지고있다().

여기에 어떤 아이디어가 있습니까? 다시 말하지만, 이것은 Firefox에서 완벽하게 작동합니다. 그것은 거의 IE가 jQuery가로드되었다고 생각하는 것처럼 보이지만 jQuery (document) .ready() 블록이 발생할 때 jQuery가 여전히로드 중이다.

답변

2

스크립트를 문서에 추가하면 비동기 적으로 다운로드됩니다. IE에서 다음 스크립트는 ...

try{ 
jQuery(document).ready(function() { 
    jQuery.getScript("/CalendarViewer/js/utils.js", function(){ 
     jQuery.getScript("/CalendarViewer/js/groupcatselector.js", function(){ 
      jQuery.getScript("/CalendarViewer/js/calendarportlet.js", function(){ 
       jQuery.getScript("/CalendarViewer/js/calendarportletmain.js", function(){ 
        var cpm = calendarportletmain; 
        cpm.doEditDefaults("V_7f208bca412b42a68c19eb104bf46f14", "/CalendarViewer", groupCats_V_7f208bca412b42a68c19eb104bf46f14); 
       }); 
      }); 
     }); 
    }); 
}); 
}catch(err){ 
    alert("error in view.jsp="+err.number+" "+err.description); 
} 

... IE가 jQuery 스크립트를 다운로드하고 구문 분석하기 전에 구문 분석되어 실행됩니다. 파이어 폭스가 이미 스크립트를 캐싱했다면 다운로드하는 데 시간이 걸리지 않고 즉시 파싱 될 수 있습니다. 파서가 다르게 작동 할 수도 있습니다. 파이어 폭스는 다운로드되는 즉시 스크립트를 파싱 할 수 있고, IE는 스레드가 유휴 상태가 될 때까지 파싱을 대기열에 넣을 수 있습니다.

이 코드를 setUpJquery 함수의 끝으로 이동할 수 있습니다. 즉,이 코드는 jQuery 개체를 사용할 수있을 때만 실행됩니다. 또는 코드를 자체 함수에 넣고 setUpJquery 함수에서 해당 함수를 호출 할 수 있습니다.

+0

감사합니다. 실제로 표시되는 코드는 실제로 여러 파일에 포함되어 있습니다. jQuery로드 스크립트는 여러 페이지에서 사용되므로 특정 코드를 넣을 수 없습니다. jQuery (document) .ready()를 체크하고 jQuery가 실제로로드 된 후에 만 ​​처리 할 수있는 다른 방법이 있습니까? – Zendog74

+0

@ Zendog74 : jQuery를 문서의 동기 부분으로 만들 수 있습니다. DOM을 사용하는 대신에'if (typeof jQuery == "undefined") 같은 것을 사용하십시오. document.write (''); 이렇게하면 다른 스크립트를 실행하기 전에 jQuery를 가져올 수 있습니다. –

+0

고마워요. 그랬어요. 확실히 우아하지는 않지만 작동합니다. 나는 IE와 FFX가 외부 스크립트를로드 할 때 일관되게 동작하길 바란다. – Zendog74

1

은 내가 주변에있어 방법이었다

$(document).ready(function() { 
    document_init(); 
}); 

function document_init() { 
    try{ 

    checkDivLoaded(); 

    [ ... do more stuff ... ] 

    } catch(err) { 
    setTimeout('document_init()', 200); 
    } 
} 

function checkDivLoaded() { 
    if ($('#targetDiv').length == 0) $jquery.error('not ready'); 
} 

그것은 꽤 아니지만이 작품 ... 그것이 내가 생각 (내가 걱정하는 것을)와 수있는 모든 브라우저에서 여러 파일에서 작동 상위 페이지 소스 코드를 망칠 필요가 없다는 의미입니다. 따라서 태그를 명확하게 유지할 수 있습니다.

관련 문제