我正在使用我们自己的瓷砖叠加层和 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,请删除解析器”。>_<