2010-03-26 3 views
2

내가 뭘 하려는지 DOM 객체를 나중에 몇 가지 의미있는 방법을 제공합니다 JS 개체의 인스턴스를 연결하는 것입니다;)이 시점에서 난 그냥 내 JS 처리하려는 참조를 그대로 유지하면서 click 이벤트를 처리하십시오.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"가 경고됩니다.

o1과 o2가 해당 DOM 객체에 대한 올바른 참조를 유지하더라도 obj의 잘못된 인스턴스가 click 이벤트에서 발생한다는 사실을 지금까지 알아 냈습니다.

어떻게 해결할 수 있습니까?

도움 주셔서 감사합니다. 클릭 이벤트가 트리거 시간에 의해, 항상 마지막 호출에 의해 반환 된 객체를 참조 할 수 있도록

안부, 클레멘스

답변

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

2

my는 글로벌이다.

my을 로컬로 만들고 obj 생성자 내부에서 클릭 기능을 정의 할 수 있습니다.

관련 문제