23

我想在 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 可以找到该元素并假设添加了事件侦听器,那么是什么阻止了事件触发呢?这是范围问题吗?

4

1 回答 1

49

它看起来不像是范围问题。getDirections 在同一范围内。

这是一个鸡蛋与鸡的案例。最终 - 您的 html 字符串不在 DOM 中,因此您还不能向其中添加事件或从中引用元素。信息窗口略微异步,因此您需要确保附加了内容 div。或者,您需要使用事件委托。

谷歌提供的事件模式可以方便地将提交处理程序附加到 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)

于 2011-06-16T21:31:40.603 回答