2014-03-07 75 views
1

這樣的代碼關於 「本」 在jQuery對象

var test = function (e,name) { 
     this.e = e; 
     this.name = name; 
     this.init(); 
    }; 
    test.prototype.init = function() { 
     var $e = $(this.e); 
     var _this = this; 
     $e.click(function() { 
      alert(_this.name); 
      //show the current name 
     }); 
     $('#AA').click(function() { 
      alert(_this.name); 
      //show all the name 
     }) 
    }; 
    new test($("#A"),"A"); 
    new test($("#B"),"B"); 

爲什麼點擊 「$ E」 只顯示當前名稱, 點擊 「$( '#AA')」 顯示所有的名字。
jsfiddle
謝謝!

+1

對我來說看起來像jquery – Rex

回答

2

因爲#AA的點擊處理程序連接了兩次。

new test($("#A"),"A"); 
new test($("#B"),"B"); 

您撥打test構造兩次,一次爲#A,一旦#Binit被稱爲兩次,因此

$('#AA').click(function() { 
    alert(_this.name); 
    //show all the name 
}) 

也將運行兩次。

在先進的事件處理模型(addEventListener,jQuery使用太當然)事件處理不互相取代(如用舊onclick和朋友),但他們加起來代替。因此,如果您將5次相同的事件處理程序添加到元素,則會在事件觸發時運行5次。

3

那是因爲你調用:

$('#AA').click(function() { 
     alert(_this.name); 
     //show all the name 
    }) 

既爲#A#B

當您致電:new test($("#A"),"A");方法init被稱爲導致附加點擊回調,因此當您點擊#AAA將會收到警報。

之後您致電:new test($("#B"),"B");。這導致init的呼叫具有不同的值。還有一個點擊處理程序附加到#AA,所以當你點擊元素時,你會得到兩個警報。

0

@kapa和@Minko是正確的。

一個快速soluction是使用unbind()避免處理被添加了兩次:

 $('#AA').unbind("click").click(function() { 
      alert(_this.name); 
      //show all the name 
     }) 

unbind()將刪除單擊處理程序,如果以前加入它。所以我們確保它被添加一次。

編輯:在嚴重的應用程序中使用off()而不是unbind()。請參閱文檔offhere

+0

但要小心,因爲調用'unbind()'從元素中爲每個**事件處理函數移除**所有事件類型。在大多數情況下,這不是一個好主意,因爲插件或代碼的其他部分可以將事件處理程序附加到同一元素,並以這種方式銷燬它們。正確的解決方案是使用[event namespaces](http://css-tricks.com/namespaced-events-jquery/)。順便說一句,從1.7開始,'off()'是首選的,而不是'unbind()'。 – kapa

+0

我編輯並配置它只刪除點擊處理程序。你對'off()'說得對。 –

+0

我仍然建議使用命名空間,因爲問題仍然適用,即使現在只適用於'click'處理程序。如果您只是從元素中移除每個'click'處理程序,就會出現神祕的,難以追蹤的錯誤。當然不是在20行的jsFiddle中,而是在一個包含多個組件的項目中,這些組件都附加了自己的處理程序。 – kapa