2011-02-18 3 views
1

이미지 묶음을 재귀 적으로로드하려고하는데 13 번의 재귀 제한 때문에 god-forsaken IE를 제외한 모든 브라우저에서 완벽하게 작동합니다.jQuery 재귀 적 이미지로드 및 IE

이제이 문제를 직접 해결할 수 있습니다.하지만 jQuery를 배우는 중이므로 "우수 사례"를 따르고 싶습니다. 그리고 저는 여기 주변의 지도자가 도움이 될만한 포인터를 줄 수 있다고 생각합니다. 어떻게 고칠 것을 제안 하시겠습니까?

내 코드 :

 
$(document).ready(function(){ 
    loadThumbs(["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg", 
       "9.jpg","10.jpg","11.jpg","12.jpg","13.jpg","14.jpg","15.jpg", 
       "16.jpg","17.jpg","18.jpg","19.jpg","20.jpg"], 0); 
}); 
function loadThumbs(files, index){ 
    if(index == files.length) return; 
    var file = files[index]; 
    var image = new Image(); 
    $(image) 
     .load(function(){ 
      $("#container").append(image); 
      loadThumbs(files, index+1); 
     }) 
     .addClass("thumb") 
     .attr("src", file); 
}

이 당신이 스택 오버플로 오류가 발생합니다 (내 경우 8) IE에서 시도하십시오.

감사합니다.

+0

어쩌면 나는 그것을 얻지 못했지만 어떻게 재귀를 중지합니까? – Dalen

+2

그냥 메모, 왜 당신은 전혀 재귀를 사용하고 있습니까? 배열의 항목을 반복하는 단순한 for-loop는 괜찮습니다. – Ozzy

+0

젠장, 내 잘못이야. 정지 조건을 삭제하는 것을 잊어 버렸습니다. 함수의 시작 부분에서 "if (index == files.length) return;" 그래서 재귀를 멈추는 것은 문제가 아닙니다. 20 개의 파일이 모두로드 된 후 중지 된 경우에도 모든 브라우저가 페이지를 올바르게 표시하고 13 번의 재귀 후에 IE가 실패합니다. –

답변

1

이미지를 하나씩 로딩하는 것이 더 깔끔해 보이기 때문에 이미지를 병렬로 로딩하는 것으로 가정합니다.

Before: 
loadThumbs(files, index+1); 

After: 
var nextIndex = index + 1; 
setTimeout(function() { loadThumbs(files, nextIndex) }, 0) 

을 그리고 네, 함수의 상단에 배열 경계에 대한 검사를 추가합니다 : 약간의 재 작성이 스택 오버 플로우 문제를 해결해야 if (!files[index]) return;, 나는 그 이유 내기 왜 IE8의 코드 휴식.

+0

죄송합니다, Alisey! 테스트를하는 동안 함수에서 정지 조건을 제거한 것을 잊어 버렸습니다. 이제는 집에 있지 않아 적절한 파일을 다시 업로드 할 수 없습니다. 나는 "if (index == files.length) false를 반환한다"라는 체크를한다. loadThumbs 함수가 시작될 때 재귀를 중지하는 것이 문제가되지 않습니다. IE가 글로벌 컨텍스트에서 13 개 이상의 재귀 함수를 처리 할 수 ​​없다는 사실이 있습니다. 나는 해결책을 찾아 냈다고 생각하지만, 유닉스 기계의 대학에서 그것을 테스트 할 수는 없다. 나는 집에 가자 마자이 질문으로 돌아갈 것이다. :) –

+0

setTimeout은 정말 트릭을했다! Спасибо, Алексей :) –

0

저는 파이어 폭스와 IE 8에서 그것을 시도했지만 실패하고 있습니다. 추가 기능이 없어도 IE 8에서 사용해 보았습니다. 코드 의견 중 하나로서

function loadThumbs(files, index){ 
var file = files[index]; 
var image = new Image(); 
$(image) 
.load(function(){ 
$("#container").append(image); 
loadThumbs(files, index+1); 
}) 
.addClass("thumb") 
.attr("src", file) 
} 

에서

전혀, 왜 사용 재귀를 물어? 다음을 시도하십시오 (구문 오류를 용언하십시오).

function loadThumbs(files){ 
for (index=0;index<files.length;i++) 
{ 
    var file = files[index]; 
    var image = new Image(); 
    $(image).load(function(){ 
    $("#container").append(image); 
    loadThumbs(files, index+1); 
    }).addClass("thumb").attr("src", file); 
} 
} 

은 아마도 귀하의 경우에는 무슨 일이 일어나고 있는지 인덱스 (배열의 경계에서) 20에 도달하면, 당신은 당신의 파일 변수에 대한 정의되지 않은를 얻을 것입니다. 이것은 브라우저를 크래시하지 않고 var 타입을 가지고 있기 때문에 정의되지 않은 변수를 전달할 것입니다. IE 8에서는 정상적으로 종료하지 않고 인덱스를 1 씩 증가시킵니다.

다른 옵션은 재귀 적 방법에 체크를 넣는 것입니다. 파이어 폭스가 20 파일 이름을 표시

$(document).ready(function() { 
     loadThumbs(["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg","11.jpg", "12.jpg", "13.jpg", "14.jpg", "15.jpg", "16.jpg", "17.jpg", "18.jpg", "19.jpg", "20.jpg"], 0); 
    }); 

    function loadThumbs(files, index) { 
     var file = files[index]; 
     $("#container").append(file); 

     loadThumbs(files, index + 1);  
    } 

와 나는 기본적인 테스트했다

(if index < files.length) {...} 

와 논리를 둘러싸고 있습니다. IE 8이 스택 오버플로 예외로 인해 충돌합니다.

+0

죄송합니다. 중지 조건을 제거한 것을 잊었습니다 :) loadThumbs 함수의 맨 앞에 다음과 같은 행이 있어야합니다. "if (index == files.length) true를 반환합니다." 배열의 끝 부분에 도달하면로드가 중단됩니다. 그러나 이것은 문제가 아닙니다. 문제는 IE가 전역 컨텍스트에서 함수에 대해 13 회 이상의 재귀를 허용하지 않는다는 것입니다. –

0

여기에서는 재귀를 사용하면 안되며 간단한 반복만으로는 충분하지 않습니다. jQuery는이 목적으로 $.each 함수를 사용합니다.

var $container = $('#container'); 

function loadThumbs(files) { 
    $.each(files, function(i, image_url) { 
     $('<img class="thumb" />').attr("src", image_url).appendTo($container); 
    }); 
} 
+0

이렇게하면 모든 이미지를 한 번에 추가하고 동시에로드 할 수 있습니다. 달성하고자하는 것은 순차 로딩입니다. Alisey가 그녀의 대답에서 "그것은 더 예쁘게 보인다"고 말했듯이, 다시 한번 말하자면 IE는 13 개 이상의 전역 재귀를 처리 할 수 ​​없다는 것입니다. –