javascript - 当这些 javascript 函数触发时,我是否正确地使用了 setTimeout() ?

标签 javascript google-maps google-maps-api-3 settimeout timing

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

这很好用。

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

执行此操作后,我注意到点击事件无法找到创建的标记。我认为这是因为标记尚未创建,因为它们仍处于延迟状态。

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

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

伪代码概述:

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 中动态创建的。我从外部源中提取标记和窗口信息,当我循环遍历标记和窗口信息时,将写入标记和窗口信息,并在该循环结束时创建所有监听器。

当脚本实际在页面加载时运行时,它会在每个标记/窗口创建之间超时。一旦标记完成,它就会加载到 map 上。如果我将标记/窗口 addListener 置于同一超时,它将看不到创建后要创建的标记/窗口,因此 addListener 将不完整。

最佳答案

这些在 PHP 中动态生成应该无关紧要,因为最终 JavaScript 永远不会注意到。由于您已经在 setTimeout 结束时创建了 marker-xwindow-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 . ";";)

关于javascript - 当这些 javascript 函数触发时,我是否正确地使用了 setTimeout() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20005345/

相关文章:

javascript - 无法理解函数重载

过滤掉字符串中常用词的JavaScript代码

javascript - (Javascript) 将 Codepen 中的变量从 JS 窗口传递到 HTML <script></script> 模板

google-maps - 谷歌地图从中绘制圆圈

javascript - 获取 Google map XML 文件的最后一个节点

javascript - 如何在 prev() 中使用正则表达式?

javascript - 从复合组件执行 JavaScript

javascript - 使用 Phonegap 的离线自定义平铺 Google map ?

javascript - 在弹出的谷歌地图 API 信息窗口中,何时获取图像?

javascript - document.write javascript 函数不起作用