2009-04-24 1 views
12

IE7에서 jQuery AJAX 호출에 문제가 있습니다. 이 간단한 코드는 FF와 Opera에서 잘 작동합니다. 그러나 IE7에서는 3-5 초가 걸립니다. - FF보다 20 배 더 느립니다! 콘텐츠를로드하는 것은 순수 HTML 및 인라인 JavaScript 코드입니다. JS 렌더링이 없습니다. 필자는 심지어 인라인 자바 스크립트 코드를 사용했다. 아직도 천천히.IE7에서 jQuery Ajax의 속도가 느린 이유는 무엇입니까?

$('#block').load('some url'); 

이 문제를 극복하는 방법은 무엇입니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

:

결과 코드는 다음과 같이인가? IE는 일반적으로 어떤 것들에는 약간 느리고, 많은 콘텐츠가 있으면 훨씬 느립니다. – cgp

+0

11KB IE7에 너무 많은가요? FF 오페라 크롬은 매우 빠르게로드됩니다. – taras

답변

16

이 문제를 극복하는 방법은 무엇입니까? 어떤 도움을 주시면 감사하겠습니다.

페이지로드시 IE7을 감지하고 느린 로딩을 원하지 않는 사용자는 업그레이드해야한다는 개별적인 제안을하십시오.

3

할 수있는 일이별로 없습니다. IE의 자바 스크립트 엔진은 다른 어떤 것보다 더 느리다. (실제로, 그것은 짜증 난다.) IE8을 사용해 볼 수 있습니다. 그것은 더 나은 ... marginally ...

+0

실제로 IE8은 훨씬 빠르며 일부 측면에서는 FF3보다 빠릅니다. 완벽한 예가 StackOverflow입니다. 나는 약 21 개의 "관심"태그를 가지고 있고, IE7은 그렇게 천천히 렌더링되었다. FF는 훨씬 좋았다. IE8로 업그레이드했을 때, IE8은 이제 stackoverflow에서 비명을 지른다. 파이어 폭스가 지금은 더 느리다. 그래서 저는 IE에 다시 돌아 왔습니다. :) – eduncan911

+6

Safari 4 또는 Chrome에서 사용해보세요. 그래, 맞아. 파이어 폭스는 최근 나를 실망시켰다. (파이어 버그 때문에 개발할 때를 제외하고 ... 우리는 그 일없이 무엇을 할까?). IE8은 개발자 도구 모음을 추가했는데로드보다로드가 더 좋았습니다 ...하지만 여전히 파이어 버그가 아닙니다. 구약에 대해서 미안해. – KyleFarris

+1

IE6 – John

8

나는 느린 jscript ie7 엔진에 동일한 문제가있었습니다. 나는 인간을위한 상태 팝업 창을 추가했다. JS가 청크로 진행됨에 따라 상태 창을 업데이트합니다. 의사 코드 :

  1. favit js 라이브러리를 사용하여 상태 컨테이너를 만듭니다. 나는 YUI를 선호한다. 그들의 컨테이너 API를 참조하십시오.
  2. 일부 데이터가로드되지 않습니다. - 먼저 청크로 분할해야합니다.
  3. 상태 팝업을 업데이트하십시오. (완료된로드 % 증가, 막대 표시기 늘리기 등) JS 스레드가 여전히 실행 중이므로이 시점에서 화면이 변경되지 않을 것입니다.
  4. 다음,
var t = setTimeout("next_step(2)", 0); 
// Where arg of 2 would mean do the second step 
// This will yield to the browser, and the display will then be updated. 
// If you want to maintain the value of "this" in the function, then do 
// something like 
var t = setTimeout("next_step.call(MyContext, 2)", 0); 
// using call to set the function's context.

결론은 사용자가 뭔가 화면에 변경 볼 것입니다 호출합니다. 시간 제한 0을 사용하여 항복하는 단계는 비교적 오래 걸립니다. 그래서 내 코드는 브라우저를 테스트하고 IE가 아닌 다른 것이라면 청크 당 더 많은 작업을 수행합니다.

사용자에게 피드백을 변경하는 것이 매우 중요합니다. 그렇지 않으면 그들은 그것이 실제로보다 오래 걸린다 고 생각합니다.

HTH,

래리

나는 실제 코드를 볼 수 있지만 내가 jQuery.load() 제거했다 유사한 문제에 직면 한 것
+0

나는이 문제를 여러 번 나 자신과 같은 "의사"스레딩 기술을 귀하의 대답에 구현했습니다. 자주 큐잉 메커니즘을 구축해야했습니다. jQuery 1.3은 큐를 구현하여 http://docs.jquery.com/Effects/queue에서이 기능을보다 쉽게 ​​사용할 수 있습니다. –

+0

우수 제안. 비동기 호출을 수행 할 때 어떤 종류의 피드백이있을 수도 있고 매우 집중적 인 알고리즘 일 수도 있습니다 (심지어 '로딩'애니메이션 일지라도). 이것은 어떤 브라우저/구현에도 적용됩니다. – KyleFarris

3

. 대신 jQuery.get() "html"데이터 유형을 사용하고 .innerHTML을 통해 데이터를 주입 한 자체 콜백을 작성했습니다. 이렇게하면 또 다른 버그 (< > 태그를 선택하고 IE에서 .innerHTML을 허용하지 않음)를 작성하여 추악한 해결 방법을 작성했습니다. 얼마나 많은 내용이로드

// Fetch data (GET method allows me to use browser cache) 
$.get(url, get, function(htmlValues, txtStatus){ 
    that.populateSelects(htmlValues, that.selectContainers); 
}, "html"); 


// Create <select> 
var select = $('<span><select disabled="disabled"></select></span>'); 
$("<option>").attr("value", "").text("Loading...").appendTo(select.find("select")); 


// Populate <select> 
that.populateSelects = function(values, selectContainers){ 
    var span, select, tags; 

    for(var i=0, len=selectContainers.length; i<len; i++){ 
     span = selectContainers[i]; 

     if($.browser.msie){ 
     tags = span.innerHTML.match(/^(<select[^>]+>).*(<\/select>)$/i); 
     span.innerHTML = tags[1] + values + tags[2]; 
     select = span.firstChild; 
     }else{ 
     select = span.firstChild; 
     select.innerHTML = values; 
     } 
     $(select).removeAttr("disabled"); 
    } 
} 
+0

이것에 대한 환호성, 나는 $ .get + innerHTML로 $ .load를 대체하여 내 앱의 로딩 시간을 몇 초 줄였습니다. –