2011-08-12 95 views
0

我使用的是ovi maps API,并且我有一个带事件处理程序的折线。事件处理程序如下所示Javascript关闭/事件处理噩梦

SomeClass = Base.extend({ 
    _clickFunction: function(evt) { 
      alert(this.someBaseClassMethod() + 'x: ' + evt.targetX+ 'y:'+ evt.targetY); 
    }, 
    go: function(){ 
      myClickableThing.addListener('click', this._clickFunction.bind(this)); 
    } 
    } 

第一次我点击我的事,我得到的X和Y是对光标的像素位置和准确的时间戳正确。对于同一个polyLine上的每个后续点击,我都会得到完全相同的X,Y和时间戳。有没有人有任何想法或解决方法?

+0

是什么线做this._clickFunction.bind(这)?从来没有见过这个.. – Baz1nga

+1

为什么你需要绑定'this._clickFunction.bind(this));'?它看起来不像函数使用'this'对象,所以你应该只能使用'this._clickFunction'。 –

+0

假设你的_clickFunction对这个对象是私有的。你不应该仅仅给这个函数的引用作为eventHandler。即myClickableThing.addListener('click',_clickFunction); – Baz1nga

回答

0

首先,谢谢所有那些回答。我确实设法解决了这个问题,尽管我不能告诉你为什么它不起作用(如果有人经常在ECMAscript标准中钓鱼,请随时与我联系)。这个问题肯定是this._clickFunction.bind(this))。由于什么原因,这会创建一个保留evt对象的闭包。解决方案(就像你在评论中提到的一些)只是简单地通过在构造函数中设置函数来解决这一问题。

原文:

SomeClass = Base.extend({ 
    _clickFunction: function(evt) { 
      alert(this.someBaseClassMethod() + 'x: ' + evt.targetX+ 'y:'+ evt.targetY); 
    }, 
    go: function(){ 
      myClickableThing.addListener('click', this._clickFunction.bind(this)); 
    } 
    } 

修正版本:

SomeClass = Base.extend({ 
    _clickFunction:null, 
    constructor: function(){ 
     this._clickFunction = function(evt) { 
      alert(this.someBaseClassMethod() + 'x: ' + evt.targetX+ 'y:'+ evt.targetY); 
     } 
    }, 
    go: function(){ 
      myClickableThing.addListener('click', this._clickFunction); 
    } 
    } 
0

反正我不确定OVImap API,但我猜测它会将自己的事件对象传递给你的处理方法。看看这是否给你正确的价值。

侦听器函数将是这样的:

myClickableThing.addListener('click', function(event){this._clickFunction(event)}); 

希望这有助于。

在附注中,我们遇到了谷歌地图和一个特定浏览器的类似问题,其中evt变量的作用域没有被正确地区分或者类似。

我不确定这是否是您的问题。