2013-07-15 70 views
2

這裏是我的代碼不能正常工作:什麼是Java的決賽在JavaScript中相當於

$(document).ready(function() { 
    for (var i = 0; i < 3; i++) { 
     var bt = new HrButton("btn" + i);      
     bt.setOnclick(function() { 
      alert(bt.name + " clicks = " + bt.cntClick); 
      bt.cntClick = bt.cntClick + 1; 
     }); 
     $("#container").append(bt.toHtml()); 
    } 
}); 

我怎樣才能保持函數內的bt三個實例。因爲它現在bt在每個onclick參考btn2

+3

究竟是你想做些什麼? – NullUserException

+6

你不需要最終的。因爲塊不會在JS中創建範圍,所以需要一個閉包來正確限定'for'迭代中的'bt'的範圍。 –

+0

你需要什麼,你想保持第三個變量?爲了什麼 ? –

回答

5

如果setOnclick是很好的實施,你應該能夠做到:

bt.setOnclick(function() { 
    alert(this.name + " clicks = " + this.cntClick); 
    this.onclick = this.cntClick + 1; 
}); 

否則,你需要創建一個新的範圍爲每個回調函數,讓他們每個人都有自己bt。要做到這一點的方法之一是:

bt.setOnclick(function(bt){ 
    return function(){ 
     alert(bt.name + " clicks = " + bt.cntClick); 
     bt.onclick = bt.cntClick + 1; 
    }; 
}(bt)); 

評論響應

爲了實現setOnClick這樣this指有關HrButton(而非element)的回調中,你可以使用下面的代碼(工作在現代瀏覽器只,unless you SHIM bind):

var self = this; 
self.setOnClick = function(fnOnClick) { 
    element.onclick = fnOnClick.bind(self); 
}; 

由於您使用jQuery下面的代碼無線會是一個跨瀏覽器相當於:

var self = this; 
self.setOnClick = function(fnOnClick) { 
    element.onclick = $.proxy(fnOnClick, self); 
}; 

否則這將在所有的瀏覽器,無需任何庫,且僅略少可讀性:

var self = this; 
self.setOnClick = function(fnOnClick) { 
    element.onclick = function(event) { 
     return fnOnClick.call(self, event); 
    }; 
}; 
+0

是不是一個真正的圖書館,是情景學習和如何我可以做一個setOnClick很好地實施,如果我有this.setOnClick(fnOnClick){elemen.onclcik = fnOnCLick; )其中元素是從documente.createElement('按鈕')創建的 – rChavz

+0

@rChavz'setOnclick'是你自己寫的一個函數嗎?上面的代碼是否解決了你的問題? – Paulpro

+0

@rChavz我用幾種方法更新了我的答案來實現'setOnClick',以便您可以使用'this'。 – Paulpro

相關問題