Google Maps API 情報ウィンドウ内の要素にイベントを追加する 質問する

Google Maps API 情報ウィンドウ内の要素にイベントを追加する 質問する

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 が添付されていることを確認する必要があります。または、イベント委任を使用する必要があります。

domreadyGoogle が提供するイベント パターンは、次のように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 の子として 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)

おすすめ記事