向 Google Maps API InfoWindow 中的元素添加事件
Posted
技术标签:
【中文标题】向 Google Maps API InfoWindow 中的元素添加事件【英文标题】:Adding event to element inside Google Maps API InfoWindow 【发布时间】:2011-09-16 16:57:24 【问题描述】:我想在 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 可以找到该元素并假设添加了事件侦听器,那么是什么阻止了事件触发呢?这是范围问题吗?
【问题讨论】:
【参考方案1】:这看起来不像是范围问题。 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);
经过测试和工作。或者,您可以将内容字符串作为某个隐藏 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)
【讨论】:
非常好 - 谢谢!我想我更喜欢你的第一个建议,而不是隐藏 div。我没有意识到 div 会发送 domready 事件。我对 JavaScript 还是很陌生,但很喜欢它。 在此期间可能发生了一些变化。这对我有用,但前提是 document.id() 被 document.getElementById() 替换,addEvent() 被 addEventListener() 替换。 那是因为最初的答案是与 MooTools 相关的。 优秀。太感谢了。这正是我一直难以解决的问题。 @dev_khan 他们移动了它。 developers.google.com/maps/documentation/javascript/infowindows -content
是最重要的一点以上是关于向 Google Maps API InfoWindow 中的元素添加事件的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:如何使用新的 Marker API 向 Google Maps 添加标记?
可以向 Google Maps API 发出多少请求而不被禁止?
对 maps.google.com 进行大量(可能约为 100000)的 api 调用会导致 getaddrinfo ENOTFOUND 错误