0

我正在使用 ovi maps API,并且我有一条带有事件处理程序的折线。事件处理程序如下所示

 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 对于光标的像素位置和准确的时间戳是正确的。对于随后在同一折线上的每次单击,我都会得到完全相同的 X、Y 和时间戳。有没有人有任何想法或解决方法?

4

2 回答 2

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);
    }
   }
于 2011-08-15T13:13:19.740 回答
0

无论如何,我不确定 OVImap API,但我猜它会将自己的事件对象传递给处理程序方法。看看这是否给你正确的价值观。

您的侦听器功能将类似于:

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

希望这可以帮助。

在旁注中,我们在谷歌地图和一个特定的浏览器上遇到了类似的问题,其中 evt 变量的范围不正确或类似的东西。

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

于 2011-08-12T17:56:18.383 回答