2010-08-12 47 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

相关问题