2011-09-29 44 views
0

我正在PhoneGap中編寫一個移動應用程序,但是當Web上有範圍上下文更改時,Webkit及其從事件列表中刪除事件偵聽器的功能似乎存在問題回調。下面是一個例子:帶有不同上下文的回調的removeEventListener()

Function.prototype.bind = function(scope) { 
    var fn = this; 
    return function() { 
     fn.apply(scope, arguments); 
    }; 
}; 

a = function(){}; 
a.prototype.tmp = function(e){ 
    var tmp = ddd.q('#tmp'); 
    tmp.className = 'active'; 
    tmp.addEventListener('webkitAnimationEnd',this.tmp2.bind([this,tmp]),false); 
} 
a.prototype.tmp2 = function(e){ 
    this[1].removeEventListener('webkitAnimationEnd',this[0].tmp2.bind([this[0],this[1]]),false); 
    this[1].className = 'inactive; 
    var t2 = ddd.q('#tmp2'); 
    t2.className = 'active'; 
    t2.addEventListener('webkitAnimationEnd',this[0].setStart.bind([this,t2]),false); 
}; 

現在,在上面的代碼中,事件偵聽器永遠不會脫落,並且無論何時回調被調用,事件偵聽器列表變得相當大 - 這表現在網絡督察。有關如何在使用可更改函數作用域的回調函數完成時刪除事件偵聽器的任何想法?

+0

您是否正確使用'bind'?它應該是'.bind(this,arg1,arg2,...)'所以你避免把'this'作爲一個數組? –

回答

1

你能用類似this jsfiddle example的東西嗎? this是點擊事件觸發的對象。 selfA對象。

Function.prototype.bind = Function.prototype.bind || function(scope) { 
    var fn = this; 
    return function() { 
     fn.apply(scope, arguments); 
    }; 
}; 

A = function() {}; 
A.prototype.click = function (el) { 
    var self = this; 
    var onClick = function() { 
     el.removeEventListener('click', onClick, false); 
     alert("this=" + this + "\nself=" + self + "\nel=" + el + "\nclicked"); 
    } 
    el.addEventListener('click', onClick, false); 
} 
A.prototype.toString = function() { 
    return "I am an A!"; 
} 

a = new A(); 
a.click(document.getElementById("a1")); 
a.click(document.getElementById("a2")); 

更新1 - second example is here。下面的主要差異。

function createOnClickHandler (scope, outerThis, el) { 
    var onClick = (function (evt) { 
     el.removeEventListener('click', onClick, false); 
     alert("this=" + this + "\nouterThis=" + outerThis + ", \nel=" + el + "\nclicked"); 
    }).bind(scope); 
    return onClick; 
} 

A = function() {}; 
A.prototype.click = function (el) { 
    var ob = { 
     toString: function() { 
      return "I am an ob!"; 
     } 
    }; 
    el.addEventListener('click', createOnClickHandler(ob, this, el), false); 
} 

更新2 - general example of a one-time event handler結合事件處理程序,以一個特定的範圍內,調用處理程序,並註銷監聽器。

function createOneTimeHandler (evtName, fn, scope, el) { 
    var bound = fn.bind(scope); 
    var onEvent = function (evt) { 
     el.removeEventListener(evtName, onEvent, false); 
     bound(evt); 
    }; 
    el.addEventListener(evtName, onEvent, false); 
} 
+0

這並不一定能解決這個問題。問題是我必須改變範圍,並且經常是不在對象上下文中的東西。這是一個時髦的想法,但在這種情況下不適用。 我會玩弄它,看看它是如何飛行;然而,我仍然需要一個更一般的用例來刪除事件偵聽器,在這裏我改變了範圍。 –

+0

好吧,我*想*我明白你的意思,所以添加了第二個綁定到一個全新對象的例子。 –

相關問題