2011-08-12 136 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變量的作用域沒有被正確地區分或者類似。

我不確定這是否是您的問題。