Google Maps API(v3)InfoWindow内に入力フィールドと送信ボタンを備えたフォームを配置したいと思います。
送信時に、入力フィールドに入力したアドレスを使用してルートサービスを開始する関数を呼び出したいと思います。
これが私のコードです(現在、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が要素を見つけて、おそらくイベントリスナーを追加できる場合、イベントの発生を妨げているのは何ですか?これはスコープの問題ですか?
スコープの問題のようには見えません。 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)