2010-03-26 56 views
2

我在這裏要做的是將一個DOM對象與一個JS對象的實例關聯起來,這將在稍後提供一些意義的方法;)此時我只想處理我的JS對象點擊事件,同時保持引用不變。JS onclick觸發錯誤的對象

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
<title>Insert title here</title> 
<script type="text/javascript"> 
// my object, which will hold a reference to a single DOM object 
obj = function(domobj) { 
this.o = domobj; 
my = this; 
var ref = my.click; 
this.o.onclick = ref; 

} 
// my objects click function 
obj.prototype.click = function() { 
    alert(my.o.innerHTML); 
} 

// create objects with references 
$(document).ready(function() { 
o1 = new obj(document.getElementById('b1')); 
o2 = new obj(document.getElementById('b2')); 
}); 
</script> 

</head> 
<body> 
<button id="b1">button 1</button> 
<button id="b2">button 2</button> 
</body> 
</html> 

預期的結果:對按鈕1,當點擊,文本 「按鈕1」 應警惕。

當前結果:當點擊按鈕1時,文本「按鈕2」被警告。

到目前爲止,我發現obj的錯誤實例是由click事件觸發的,儘管o1和o2保持對其對應DOM對象的正確引用。

任何想法如何解決這個問題?

感謝您的幫助!

最好的問候,克萊門斯

回答

1

當您將函數分配給像onclick這樣的DOM元素屬性時,該函數中的(將在調用時)將成爲DOM元素。但是,您可以通過使用apply和/或稍微關閉來改變這一點。

檢查了這一點(它仍然是非常像你的榜樣,但看到現在正在發生的事情的意見):

<script type="text/javascript"> 
// Obj with properties of its own, including a cool DOM object 
function Obj(domobj, name) { 
    this.name = (typeof name==='undefined') ? 'Clemens Prerovsky' : name; 
    this.o = domobj; 
    // Closure time! Preserve this 'this', using 'that' 
    var that = this; 
    domobj.onclick = function() {return that.clickHandler();}; 
} 
// Handler of clicks 
Obj.prototype.clickHandler = function() { 
    alert(this.o.innerHTML+', name:'+this.name); 
} 

// Create objects with references 
$(document).ready(function() { 
    var o1 = new Obj(document.getElementById('b1')); 
    var o2 = new Obj(document.getElementById('b2'), 'npup'); 
}); 
</script> 

我勸你不要錯誤地創建全局變量。保重並聲明你的變量,這樣你就不會有那麼多討厭的驚喜。在這個例子中剩下的是o1o2對象。

當創建循環引用時,總是潛伏着令人討厭的驚喜,並且如果沒有處理屬性,就會冒內存泄漏的風險。這種「自定義對象」是否真的需要這種方式?

HTH。

+0

嗨,大家好 - 感謝您的幫助。顯然,我不明白如何正確使用閉包,儘管偶然會造成全局變量: - /。 自定義對象是需要的,因爲它們表示內聯編輯器的各個實例,並具有各種設置(不同的格式化按鈕等)。 無論如何 - 現在我明白了 - 非常感謝你! – blacktarmac 2010-03-28 10:17:03

2

my是一個全球性的,因此通過觸發點擊事件的時候,它總是引用到最後調用返回的對象。

您可以製作my local並在obj構造函數中定義click函數。