23

Google Maps API(v3)インフォウィンドウ内に入力フィールドと送信ボタンを備えたフォームを配置したいと思います。

提出したら、入力フィールドに入力したアドレスを使用してルートサービスを開始する関数を呼び出したいと思います。

これが私のコードです(私は現在、directionsイベントが発生しているかどうかをテストしているだけです。完全な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が添付されていることを確認する必要があります。または、イベント委任を使用する必要があります。

domreadyグーグルが提供するイベントパターンは、次のようにdivに送信ハンドラーをアタッチするのに便利です。

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の子としてコンテンツstingを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 に答える