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));

在最后一种情况下,事件处理程序是一个匿名函数,即自调用函数的返回值。这个自调用函数接收到当前作用域的两个参数。
闭包的好处在于,这些变量与回调函数相关联。它们不是垃圾收集的,因此匿名回调函数可以访问它们,甚至将它们传递给checkData函数。

想想闭包,至少在这里使用它们的方式,作为当前范围的快照,它的变量和它们各自的值。冻结在创建闭包时的状态。一开始有点难以理解,但 Douglas Crockford 在 youtube 上有几个视频,他谈到了关闭。我建议看他们。你会惊讶于你可以用闭包做什么,一般来说 JS。

更新2

我刚刚阅读了您的评论,您所追求的(我假设)将如下所示:

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 回答