Javascript关闭/事件处理梦魇

时间:2011-08-12 17:39:42

标签: javascript events maps closures ovi

我正在使用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对于光标的像素位置和准确的时间戳是正确的。对于每次后续点击相同的polyLine,我得到完全相同的X,Y和时间戳。有没有人有任何想法或解决方法?

2 个答案:

答案 0 :(得分:0)

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

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

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

希望这有帮助。

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

我不确定这是不是你的问题。

答案 1 :(得分: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);
    }
   }
相关问题