錯誤處理程序創建我的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 。
所以在第一種情況下刪除一個時,deledes兩者,這不應該做的!
我的問題是:是否有任何類似jquery Function.createDelegate?我不想僅爲一個功能使用整個另一個MicrosoftAjax庫。 或者,也許這個問題的任何一般解決方案 - 如何告訴jQuery處理程序是不同的。謝謝您的回答。