2012-02-06 30 views
2

錯誤處理程序創建我的JavaScript類:

<html> 

<head> 
    <script src="MicrosoftAjax.js" type="text/javascript"></script> 
    <script src="jquery-1.6.4.min.js" type="text/javascript"></script> 

</head> 

<body> 

<script type="text/javascript"> 

var ClientControl = function() { 
    //some instance-specific code here 
}; 

ClientControl.prototype = { 
    initialize: function() { 
     this.documentClickedDelegate = $.proxy(this.documentClicked, this); 
     //this.documentClickedDelegate = Function.createDelegate(this, this.documentClicked); // from MicrosoftAjax 
    }, 

    bind: function() { 
     $(document).bind("click", this.documentClickedDelegate); 
    }, 

    unbind: function() { 
     $(document).unbind("click", this.documentClickedDelegate); 
    }, 

    documentClicked: function() { 
     alert("document clicked!"); 
    } 
}; 

var Control1 = new ClientControl(); 
Control1.initialize(); 
var Control2 = new ClientControl(); 
Control2.initialize(); 

Control1.bind(); 
Control2.bind(); 

Control1.unbind(); 
//Control2`s documentClickedDelegate handler, if created with $.proxy, already is unbound! 

</script> 
</body> 
</html> 

所以,問題是,當解除綁定()第一控制1對象的方法被調用,它解除綁定BOTH documentClickedDelegate這兩個對象的處理程序,如果它們是用$ .proxy()方法創建的。 所以jquery事件系統認爲這些處理程序是相同的,儘管不同的上下文傳遞給$ .proxy()方法。

如果documentClickedDelegate處理程序以Function.createDelegate創造 - MicrosoftAjax Library`s方法,一切workds罰款。處理程序是不同的。

原來,$ .proxy爲傳遞的不同上下文創建了相同的代理函數。從官方網站:

「要知道,然而,jQuery的事件綁定子系統 唯一的ID分配給每個事件,以便處理功能來跟蹤它時,它 用於指定的功能相綁定的。函數 由jQuery.proxy()表示的事件子系統被看作是一個單一的函數,即使它用於綁定不同的上下文時也是如此。避免解除綁定錯誤的處理程序,爲綁定和解除綁定使用唯一的事件名稱空間( 例如「click.myproxy1」),而不是在解除綁定期間指定 代理函數。「

在我的情況下應該做什麼,因爲命名空間分離特定於類型的事件,而不是特定於實例的特定事件。

下面是截圖,在這裏你可以看到,$ .proxy創建具有相同GUID = 1處理程序和Function.createDelegate創建不同GIUDs處理程序:GUID = 1和GUID = 2

enter image description here

enter image description here

enter image description here

enter image description here

所以在第一種情況下刪除一個時,deledes兩者,這不應該做的!

我的問題是:是否有任何類似jquery Function.createDelegate?我不想僅爲一個功能使用整個另一個MicrosoftAjax庫。 或者,也許這個問題的任何一般解決方案 - 如何告訴jQuery處理程序是不同的。謝謝您的回答。

回答

6

您確實需要命名空間事件。簡單示例:

var counter = 0; 

ClientControl.prototype = { 
    initialize: function() { 
     this.documentClickedDelegate = $.proxy(this.documentClicked, this); 
     this.num = counter++; 
    }, 
    bind: function() { 
     $(document).bind("click.proxy" + this.num, this.documentClickedDelegate); 
    }, 
    unbind: function() { 
     $(document).unbind("click.proxy" + this.num, this.documentClickedDelegate); 
    }, 
    documentClicked: function() { 
     alert("document clicked!"); 
    } 
} 

這裏是working version。點擊文檔上的任意位置即可獲得一個警報。如果沒有命名空間你2.