我想调用一个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中放入什么来在特定时间内将其称为事件处理程序?如何将值传递给它?或者我需要将值传递给它吗?
答案 0 :(得分:2)
答案 1 :(得分: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来做什么。
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');
}
}