2010-08-12 3 views
2

지도에 여러 마커를 그려 넣은 Google지도 JS가 있습니다. 그러나 마커를로드 할 때 이미지가 시간 내에로드되지 않아 마커가 배치되지 않은 것으로 나타났습니다.JavaScript img onLoad 및 Closure -이 코드가 무한 루프를 트리거하는 이유는 무엇입니까?

function newGoogleMapPin(type){ 
    var imgpath = "img/gmapicons/"+type+".png"; 
    var img = new Image(); 
     img.src = imgpath; 
    var imgloaded = false; 

    while(imgloaded == false) { 
     img.onload = function() { 
      imgloaded = true; 
     } 
    } 

    return new google.maps.MarkerImage(imgpath, new google.maps.Size(img.width, img.height)); 
} 

문제의 존재가 imgloaded이 나는 클로저를 오해하고 있는가, true로 설정되지 않습니다되어 이 해결하기 위해 나는 다음과 같이지도 아이콘을 돌려 내 함수를 수정? (그렇게 생각합니다!)

+1

되지 않은 변수'imloaded'가있어, 실수? –

+0

옙, imgloaded 했어야합니다 :) – Sergio

답변

3

JavaScript는 근본적으로 단일 스레드이며,이 단일 스레드는 실제로 JavaScript 실행과 브라우저 렌더링간에 공유된다는 점에 유의해야합니다. 따라서 귀하의 while 루프는 스레드를 차단하고 영원히 반복됩니다. 코드에서

while(imgloaded == false) { 
    // onload will never get called: 
    img.onload = function() { 
     imgloaded = true; 
    } 
} 
+0

흠, 알겠습니다,이 문제를 해결할 수 있습니까? – Sergio

+1

@Sergio : Google 마커 (v2 및 v3 API 모두)에 맞춤 이미지를 사용했는데 전혀 문제가 없었습니다. 이미지를 제공하는 서버에 큰 대기 시간이있는 경우 기껏해야 마커가 맵에 조금 나중에 표시됩니다. 그러나이 작업은 자동으로 처리되므로 수행중인 작업을 수행 할 필요가 없습니다. 언젠가 이전에 이미지를로드하여 브라우저 캐시에 이미있을 수 있지만 일반적으로 필요하지는 않습니다. –

0

imgloaded 은 (newGoogleMapPin 함수의 범위에서) 로컬 변수이다. 따라서 imgloaded 변수는 또 다른 변수입니다. 첫 번째 변수는이 경우 항상 false이며 무한 루프가 발생합니다.

이 문제를 해결하려면 기능 블록 외부에서 글로벌 변수로 선언하십시오.

+0

그 함수 내에서'imgloaded'를 사용할 수 있습니다. 클로저가 작동하는 방식입니다 (하지만'newGoogleMapPin' 외부에서 액세스 할 수는 없습니다). –

+0

"따라서'onload' 콜백에 설정된'imgloaded' 변수는 또 다른 변수입니다." ... 글쎄, 사실이 아니야. JavaScript는 어휘 범위를 가지고 있습니다 ... 또한, 전역 변수는 거의 문제를 해결하지 않습니다. –

+0

이것은 잘못된 이유로 정확한 결과입니다. 변수 global을 변경해도 아무 것도 변경되지 않습니다. – lincolnk

1

while 루프에서 수행하는 작업은 이미지의 onload 핸들러를 함수로 설정하는 것입니다. 이 함수는 실제로 호출되지 않습니다.

onload 핸들러를 한 번만 설정하고 핸들러가 이미지에 필요한 모든 작업을 수행하도록해야합니다 (핀 추가). 이 같은

뭔가 :

function newGoogleMapPin(type){ 
    var imgpath = "img/gmapicons/"+type+".png"; 
    var img = new Image(); 
    img.src = imgpath; 
    img.onload = function() { 
       new google.maps.MarkerImage(imgpath, new google.maps.Size(img.width, img.height)); 
    } 
} 
+0

나는 OP가 마커에 대한 참조를 유지하기 위해이 함수의 반환 값을 사용하고 있다고 생각합니다. 그가 제안한 방법을 사용하면 불가능합니다. –

+0

마커에 대한 참조가 기술적으로 필요하지 않으므로이 방법을 사용할 것입니다. – Sergio

관련 문제