0

我正在使用我们自己的瓷砖叠加层和 KML 元素在网站上实施 Google 地图。我之前被要求创建代码,例如,当从特定 URL 加载页面时,它将使用已启用的图块叠加层之一进行初始化。最近,有人要求我对由 KML 元素勾勒出的建筑物执行相同的操作,以便在到达具有特定 URL 的页面时,它会自动缩放、居中并显示建筑物的信息。

但是,虽然从瓦片覆盖开始工作,但构建 KML 却没有。在做了一些测试之后,我确定当检查 URL 的代码执行时,页面仍在加载 KML 元素,因此不存在用于比较或使用的代码:

评估 URL 的代码(放在 onLoad="initialize()" 的末尾)

function urlClick() {
    var currentURL = window.location.href; //Retrieve page URL
    var URLpiece = currentURL.slice(-6);   //pull the last 6 digits (for testing)
    if (URLpiece === "access") {           //If the resulting string is "access":
        access_click();                      //Display accessibility overlay
    } else if (URLpiece === "middle") {    //Else if the string is "middle":
        facetClick('Middle College');        //Click on building "Middle College"
    };
};

刻面点击();

function facetClick(name) {  //Convert building name to building ID.
    for (var i = 0; i < active.placemarks.length; i++) {
        if (active.placemarks[i].name === name) {
            sideClick(i)     //Click building whose id matches "Middle College"
        };
    };
};

Firebug 控制台错误

active is null
for (var i = 0; i < active.placemarks.length; i++) {

active.placemarks 是页面上加载了哪些 KML 元素,为 null 表示尚未加载 KML。简而言之,我的时机不对,在 KMl 加载后,我似乎找不到合适的位置来放置要执行的 URL 代码。如上所述,我将它放在 onLoad="initialize()" 的末尾,但似乎不是等待 KML 在函数中更早地完全加载,而是执行函数的其余部分:

onLoad="初始化()"

information();   //Use the buttons variables inital state to set up description
buttons();       //and button state
button_hover(0); //and button description to neutral.

//Create and arrange the Google Map.

//Create basic tile overlays.

//Set up parser to work with KML elements.
myParser = new geoXML3.parser({ //Parser: Takes KML and converts to JS.
    map: map,                   //Applies parsed KML to the map
    singleInfoWindow: true,
    afterParse: useTheData      //Allows us to use the parsed KML in a function
});
myParser.parse(['/maps/kml/shapes.kml','/maps/kml/shapes_hidden.kml']);
google.maps.event.addListener(map, 'maptypeid_changed', function() {
    autoOverlay();
});

//Create other tile overlays to appear over KML elements.

urlClick();

我怀疑我的问题之一在于使用将我们的 KML 文件转换为 Javascript的 geoxml3 解析器 ( http://code.google.com/p/geoxml3/ )。虽然页面已完成所有元素的加载,但页面上的地图仍在加载,包括 KML 元素。我还尝试将 urlClick() 放置在解析器本身的各个位置,这些位置似乎在解析所有形状后执行,但我在那里也没有成功。

虽然我一直打算去掉解析器,但我想知道在解析器返回 KML 形状后是否有任何方法可以执行“urlClick”。理想情况下,我不想使用任意方式定义等待时间,例如“等待 3 秒,然后继续”,因为我的各种浏览器都在不同时间加载页面;相反,我正在寻找某种方式来表达“当解析器完成时,执行”或“当谷歌地图完全加载时,执行”,甚至可能是“在推进到 urlClick 之前保持直到解析器完成”。


编辑:这里是地图的链接,上面找到了问题的基本形式。由于我一直在测试服务器上开发地图的下一个更新,因此 facetClick() 不是此实时版本的一部分,而是使用它的输出函数 sideClick(); 但是在这种安排中错误仍然相同:

active is null
google.maps.event.trigger(active.gpolygons[poly],'click');

地图:http ://www.beloit.edu/maps/

带有可访问性的地图:http ://www.beloit.edu/maps/?access

带有建筑的地图点击:http ://www.beloit.edu/maps/?middle


编辑:我一天中的大部分时间都在用 Javascript 重建解析器的功能,而且,低而看,没有解析器它工作得很好。我认为这很明显,因为我必须在代码之前单独定义每个形状,而不是等待解析器传递它。答案似乎是“如果您想要唯一的 URL,请删除解析器”。>_<

4

1 回答 1

1

在处理执行函数之前等待标记和 infoWindows 加载时,我遇到了类似的问题。我在这里找到了一个解决方案(如何检查 Google 地图是否已满载?请参阅@Veseliq 的答案),使用 google maps 事件侦听器函数检查地图何时“空闲”,可以解决问题。我认为这个解决方案也适用于 KML 图层。本质上,您要做的是在初始化函数的末尾包含以下内容:

google.maps.event.addListenerOnce(map, 'idle', function(){
    // do something only the first time the map is loaded
});

在 API 参考 ( https://developers.google.com/maps/documentation/javascript/reference ) 中,它声明 'idle' 事件“在地图在平移或缩放后变为空闲时触发”。但是,在 map_canvas 中的所有内容加载后,它也会在初始页面加载时触发,这似乎是正确的。通过使用该addListenerOnce调用,您可以确保在初始页面加载后不再执行它(这意味着它不会在缩放或平移操作后触发)。


第二种选择:
正如我提到的,您可以采用回调方法,我相信这只会在完成解析后调用您的 urlClick 函数。以下是您应该如何安排代码以使其工作:

function someFunction(callback){
    myParser.parse(['/maps/kml/shapes.kml','/maps/kml/shapes_hidden.kml']);
    callback();
}

然后在您的初始化中,您将拥有:

someFunction(function(){
    urlClick();
});

您必须使您的mapmyParser变量成为全局变量。

资源:此链接对回调函数如何在 javascript 中工作进行了出色而详细的简要介绍,http://www.impressivewebs.com/callback-functions-javascript/

于 2012-06-06T19:51:51.647 回答