在Google Maps API InfoWindow中向元素添加事件

tim*_*ohn 22 javascript mootools infowindow google-maps-api-3 mootools-events

我想在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();
}
Run Code Online (Sandbox Code Playgroud)

当我在我的网站的其他地方使用MooTools时,我将所有代码放入其中 window.addEvent('load', function(){...});

请注意dbug.log($("map-form"));正确输出表单元素的控制台跟踪,但事件未触发.

我在DOM中将相同的事件添加到另一个表单(具有不同的ID)并且它工作正常.

那么,如果MooTools可以找到该元素并据说添加事件监听器,那么阻止事件触发的是什么?这是范围问题吗?

Dim*_*off 48

它看起来不像范围问题.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);
Run Code Online (Sandbox Code Playgroud)

经过测试和工作.或者,您可以将内容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)

  • 他们不.这只是谷歌特定的东西. (3认同)
  • 在此期间,某些事情可能已发生变化.这适用于我,但仅当document.id()由document.getElementById()和addEventListener()的addEvent()替换时才有效. (2认同)