2010-08-12 42 views
2

我有一些Google Maps JS在地圖上繪製了許多標記。但是,當加載標記時,我發現圖像沒有及時加載,所以標記沒有放置。 爲了解決這個問題我修改函數返回的地圖標記如下:JavaScript img onLoad和closures - 爲什麼這段代碼會觸發一個無限循環?

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',錯了嗎? – 2010-08-12 14:54:06

+0

是的,應該已經imgloaded :) – Sergio 2010-08-12 16:27:24

回答

3

你必須記住,JavaScript基本上是單線程的,而這個單線程實際上是在JavaScript執行和瀏覽器渲染之間共享的。因此,您的while循環將阻止該線程,並將永久循環。

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

嗯,我明白了,你能看到解決辦法嗎? – Sergio 2010-08-12 14:51:08

+1

@Sergio:我爲Google標記使用了自定義圖像(包括v2和v3 API),並且從未遇到任何問題。至多,如果服務器映像的服務器有很大的延遲,那麼標記將稍後顯示在映射上。但是,這是自動處理的,應該不需要像你一樣做一些事情。您可能還可以在某個時間之前加載圖像,以便它們已經在瀏覽器緩存中,但通常情況下,您不需要。 – 2010-08-12 14:56:07

0

imgloaded在你的代碼是一個局部變量(在newGoogleMapPin功能的範圍)。因此,onload回調中設置的imgloaded變量是另一個變量。在這種情況下,第一個變量總是爲false,這會導致無限循環。

要解決該問題,請在功能塊外聲明爲全局變量。

+0

你可以在該函數內部使用'imgloaded',這就是閉包的工作方式(但你說得對,它不能在'newGoogleMapPin'之外訪問)。 – 2010-08-12 14:58:36

+0

「因此,'onload'回調中設置的'imgloaded'變量是另一個變量。」 ......那不是事實。 JavaScript有詞法範圍....另外,全局變量很少能解決問題。 – 2010-08-12 15:04:33

+0

這是錯誤原因的正確結果。使變量全局不會改變任何東西。 – lincolnk 2010-08-12 15:07:12

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使用這個函數的返回值來保持對標記的引用。如果他使用你所建議的方法,那將是不可能的。 – 2010-08-12 14:59:56

+0

我會給這個方法一個鏡頭,因爲我沒有技術上需要參考標記。 – Sergio 2010-08-12 15:03:03

相關問題