我想在Google Maps API(v3)InfoWindow中添加一个带有输入字段和提交按钮的表单。
提交时,我想调用一个函数,使用在输入字段中输入的地址启动路线服务。
这是我的代码(我目前只测试方向事件是否被触发。我已经编写了完整的getDirections()
事件,并且可以确认它有效并在正确触发时返回指示):
我尝试使用MooTools添加一个事件监听器,如下所示:
var infoWindowContent = "<b>Get Directions From...</b><br />"
+ "<form id='map-form'>"
+ "Address/Postcode: <input id='map-from-address' type='text' />"
+ "<input type='submit' id='map-go' value='Go' />"
+ "</form>";
var infoWindow = new google.maps.InfoWindow({
content: infoWindowContent
});
google.maps.event.addListener(marker, 'click', function() {
infoWindow.open(map, marker);
dbug.log($("map-form"));
$("map-form").addEvent("submit", getDirections);
});
function getDirections(event)
{
dbug.log("getDirections");
event.stop();
}
当我在我的网站的其他地方使用MooTools时,我将所有代码放在window.addEvent('load', function(){...});
请注意正确输出表单元素的控制台跟踪dbug.log($("map-form"));
,但事件未触发。
我在DOM中将相同的事件添加到另一个表单(具有不同的ID),并且工作正常。
那么,如果MooTools可以找到该元素并据说添加事件监听器,那么阻止事件触发的是什么?这是范围问题吗?
答案 0 :(得分:47)
它看起来不像范围问题。 getDirections属于同一范围。
这是鸡蛋与鸡的情况。最终 - 您的html字符串不在DOM中,因此您无法向其添加事件或从中引用元素。信息窗口略有异步,因此您需要确保附加了内容div。或者,您需要使用事件委派。
事件模式google提供了方便的方法来附加div domready
上的提交处理程序,如下所示:
var infoWindowContent = [
"<b>Get Directions From...</b><br />",
"<form id='map-form'>",
"Address/Postcode: <input id='map-from-address' type='text' />",
"<input type='submit' id='map-go' value='Go' />",
"</form>"
].join("");
var info = new google.maps.InfoWindow({
content: infoWindowContent
});
google.maps.event.addListener(info, 'domready', function() {
document.id("map-form").addEvent("submit", function(e) {
e.stop();
console.log("hi!");
});
});
info.open(map, marker);
测试和工作。或者,您可以将内容sting作为一些隐藏div的子项附加到dom中,添加事件然后将div作为内容传递给它,因为它支持指向节点。
https://developers.google.com/maps/documentation/javascript/infowindows
或者,您可以使用事件委派
例如
topnode.addEvent('submit:relay(#map-form)', function(e){ });
- 或等效的jQuery,例如$(document).on('submit', '#map-form', fn)