1

次のような Google イベント リスナーを呼び出したいとします。

google.maps.event.addListener(trucks[data.results[i].id], 'click', function() 
{
// Do the magic :)
}

同じスコープで定義されていない関数から:

関数は次のようになります。

function checkData(){}

どうやってやるの?クリック値と同じになるように、どうにかして値を送信できますか? クリックイベントで動作する必要があることを意味しますが、通常どおり呼び出したいです。

編集:もっと具体的にしましょう:

次のようなものがあります。

function initialize()
{
google.maps.event.addListener(trucks[data.results[i].id], 'click', function() {};
}

そして、私たちが持っているさまざまな範囲で

function checkData()
{
   for (var i = 0; i < window.data.results.length; i++) 
   {
     if(window.data.results[i].driver_id==selectedIndex) 
     {
       // I want to sent the founded object to the event handler in this particular time

     }
   }

}

特定の時間にイベント ハンドラーを呼び出すには、checkData の中に何を入れる必要がありますか? 値を渡すにはどうすればよいですか? または、値を渡す必要がありますか?

4

2 に答える 2

2

改訂された回答:

google.maps.event名前空間にはtriggerメソッドが含まれています。このメソッドを使用して、(たとえば)オブジェクトのクリックイベントをシミュレートできます。そのオブジェクトへの参照が必要です。

こちらのデモ

于 2012-07-02T15:20:29.690 に答える
2

まあ、それはかなり簡単です。関数を宣言したスコープ/コンテキストに応じて:

グローバルオブジェクト内:google.maps.event.addListener(trucks[data.results[i].id], 'click', checkData);。これは、コールバックへの参照を渡すだけです。現在のスコープで見つからない場合、JSはグローバルオブジェクトを参照します。

他のオブジェクト:

google.maps.event.addListener(trucks[data.results[i].id], 'click', function(e)
{
    someObj.checkData.apply(this,[e]);
});

最後のケースでは、イベントオブジェクトeが引数として渡されます。関数内はthis、リスナーが接続されたクリックされた要素/要素を参照します。

編集

あなたは閉鎖を探しています、AFAIK:

google.maps.event.addListener(trucks[data.result[i].id],'click',function(e)
{
    //this function will be called on each click, e is the event object:
    checkData.apply(this,[e]);//more arguments? change [e] with: [e,arg2,arg3,...]
});

ただし、ローカルスコープからの引数を渡す必要がある場合は、クローザーがさらに意味をなし始めます。

var insideAfunction ='This string is local';
var anotherOne = {foo:'bar',so:'is this object'};
google.maps.event.addListener(trucks[data.result[i].id],'click',(function(local1,local2)
{
    function(e)
    {
        checkData.apply(this,[e,insideAfunction,anotherOne]);
    }
})(insideAfunction,anotherOne));

最後の場合のイベントハンドラーは無名関数であり、これは自己呼び出し関数の戻り値です。この自己呼び出し関数は、現在のスコープに対してローカルな2つの引数を受け取りました。
クロージャの優れている点は、これらの変数がコールバック関数にリンクされていることです。それらはガベージコレクションされないため、匿名のコールバック関数がそれらにアクセスしたり、関数に渡したりすることができますcheckData

クロージャ、少なくともここで使用されている方法を、現在のスコープ、その変数、およびそれぞれの値のスナップショットと考えてください。クロージャーが作成されたときの状態で凍結されました。最初は頭を丸めるのは少し難しいですが、ダグラス・クロックフォードはYouTubeにいくつかの動画を公開しており、そこで彼は閉鎖について語っています。それらを見ることをお勧めします。クロージャ、そしてJS全般で何ができるかに驚かれることでしょう。

Update2

私はあなたのコメントを読んだだけです、あなたが求めているもの(私は推測します)は次のようになります:

google.maps.event.addListener(trucks[data.results[i].id],'click',(function(mapObj)
{
    //mapObj === trucks[data.results[i].id]
    function(e)
    {
        checkData.apply(this,[mapObj]);
    }
})(trucks[data.results[i].id]));

そして今、checkData関数で:

function checkData()
{
    //your snippet leads me to believe it usually doesn't get arguments passed
    //as a callback, however, we're passing a google map object, access it like so:"
    var passedObject = arguments[0];// === mapObj === trucks[data.results[i].id]
    //safer, even:
    var passedObject = arguments[0] || undefined;
    if (passedObject instanceof Object)
    {
        alert('Called from event');
    }
    else
    {
        alert('called as a regular function');
    }
}
于 2012-07-02T15:21:56.820 に答える