1

Google マップ アプリを作成していますが、地図の外にコンパスの画像があります。各コンパス ポイントはイメージ マップ上にあり、独自の ID を持っています。クリックしたコンパス ポイントに応じて、45° の向きを変更します。

Googleマップinitialize機能内に、次の行があります:

google.maps.event.addDomListener(document.getElementById('compassSouth'), 'click', map.setHeading(180));

ただし、そのハンドラーはページの読み込み時に起動され、その後は応答しません。これはイメージ マップが原因ではありません。要素がボタンの場合も同じ動作が発生します。

ボタンの押下に応答する同じ形式の別のハンドラーがありますが、これは正常に機能します。

4

1 に答える 1

1

コードは、まさにあなたが指示したことを実行しています。つまり、コードを実行するとすぐmap.setHeading(180)に関数が呼び出されます。

わかりやすくするために、行ごとに書きましょう。

var element = document.getElementById('compassSouth');
var listener = map.setHeading( 180 );
google.maps.event.addDomListener( element, 'click', listener );

ご覧のとおり、このコードはコードmap.setHeading(180)を記述した場所をすぐに呼び出し、その関数からの戻り値(今は を呼び出していますlistener) をに渡しaddDomListener()ます。

しかし、map.setHeading(180)まったく値を返しません。別の言い方をundefinedすれば、 を返しlistenerますundefined

addDomListener()その値を見てundefined無視します。リスナーはまったく設定されません。

代わりに、関数への参照を に渡す必要がありますaddDomListener()。これは次のように簡単に行うことができます。

function compassClick() {
    map.setHeading( 180 );
}

var element = document.getElementById('compassSouth');
google.maps.event.addDomListener( element, 'click', compassClick );

または、よくあることですが、代わりにその関数を無名関数にすることもできますcompassClick(元のコードに戻ってください)。

google.maps.event.addDomListener(
    document.getElementById('compassSouth'), 'click',
    function() {
        map.setHeading( 180 );
    }
);
于 2013-05-11T03:59:47.067 に答える