Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当这些javascript函数启动时,我是否正确地使用setTimeout()计时?_Javascript_Google Maps_Google Maps Api 3_Settimeout_Timing - Fatal编程技术网

当这些javascript函数启动时,我是否正确地使用setTimeout()计时?

当这些javascript函数启动时,我是否正确地使用setTimeout()计时?,javascript,google-maps,google-maps-api-3,settimeout,timing,Javascript,Google Maps,Google Maps Api 3,Settimeout,Timing,我正在使用Google Maps API v3创建一个交互式地图,地图上有标记,单击标记时会打开信息窗口。这个过程是创建一个标记,创建一个信息窗口,并通过单击将两者绑定(该事件还将关闭任何其他打开的信息窗口) 这个很好用 我希望标记连续下降,因此我添加了一个延迟,该延迟根据每个标记的计数而增长 在我这样做之后,我注意到点击事件无法找到创建的标记。我想这是因为标记尚未创建,因为它们仍处于延迟状态 我的解决方案是向绑定函数添加一个延迟,该延迟等于最后一个标记的延迟+一点额外的时间 我的问题是,这是否

我正在使用Google Maps API v3创建一个交互式地图,地图上有标记,单击标记时会打开信息窗口。这个过程是创建一个标记,创建一个信息窗口,并通过单击将两者绑定(该事件还将关闭任何其他打开的信息窗口)

这个很好用

我希望标记连续下降,因此我添加了一个延迟,该延迟根据每个标记的计数而增长

在我这样做之后,我注意到点击事件无法找到创建的标记。我想这是因为标记尚未创建,因为它们仍处于延迟状态

我的解决方案是向绑定函数添加一个延迟,该延迟等于最后一个标记的延迟+一点额外的时间

我的问题是,这是否是控制这种情况的最佳方式

伪代码概述:

function mapInit(){

    google create map code;
    //Begin First PHP loop, pulls all information in
    setTimeout(function(){  //PHP loop iteration 1
        create marker1;
        create window1;
    }, 1 * 150);

    setTimeout(function(){  //PHP loop iteration 2
        create marker2;
        create window2;
    }, 2 * 150);

    setTimeout(function(){  //PHP loop iteration 3
        create marker3;
        create window3;
    }, 3 * 150);
                            //end first PHP loop

    function createListeners(){

        //begin second PHP loop over markers

        google.maps.event.addListener(marker1, 'click', function() {  //iteration 1

            //internal loop over windows and if for each window
            open window1;  //if is true, open instead of close
            close window2;
            close window3;
        }
        google.maps.event.addListener(marker2, 'click', function() {  //iteration 2

            //internal loop over windows and if for each window    
            open window2;
            close window1;
            close window3;
        }
        google.maps.event.addListener(marker3, 'click', function() {  //iteration 3

            //internal loop over windows and if for each window
            open window3;
            close window1;
            close window2;
        }
    }

    setTimeout(function() {
        createListeners();
    }, 3 * 150 + 100);}

}

on window.load call mapInit();
更多详情:

javascript是在PHP中动态创建的。我从外部源中提取标记和窗口信息,当我循环标记和窗口信息被写入时,在循环结束时,监听器都被创建


当脚本在页面加载时实际运行时,它会在每个标记/窗口创建之间超时。一旦做了标记,它就被载入地图。如果我将marker/window addListener置于相同的超时,它将看不到创建后要创建的marker/windows,因此addListener将不完整

这些都是在PHP中动态生成的并不重要,因为最终JavaScript不会注意到。由于在
setTimeout
结束时,您已经创建了
marker-x
window-x
,因此应该可以向它们添加事件侦听器:

setTimeout(function(){
    create marker1;
    create window1;
    google.maps.event.addListener(marker1, 'click', function() {
        open window1;
        close window2;
        close window3;
    };
}, 1 * 150);

如果您不知道将有多少项,可以在PHP中跟踪它,然后将该信息传递给JavaScript(例如,
echo“var numOfItems=”.$numItems.;”;

为什么不将
addListener()放在
计时器回调中的代码?尝试同步
n
计时器以同时执行相应的事件几乎永远都不是答案。@Pointy此代码是动态创建的。为了创建所有addListener(),所有标记和信息窗口都必须被称为listener必须打开1并关闭其余的。@Alex W我想应该是这样的,这就是我来这里的原因,有什么建议吗?我对语言及其所有选项都比较陌生。那么你需要发布更多信息来更全面地描述情况。在1个函数中,你只创建第一个标记和窗口,这不是一个问题吗,然而,创建一个监听器涉及的窗口由于超时时间较长而尚未创建。对我会先创建所有的窗口。如果需要在循环中创建它们,那么应该跟踪PHP中有多少,然后将该信息传递给JavaScript。创建窗口时,它不应渲染任何内容,因此不会影响标记的放置效果。