Javascript jsonclick触发错误的对象
我在这里尝试的是将DOM对象与JS对象的实例相关联,这将在稍后提供一些有意义的fol方法;)此时,我只想处理我的JS对象click事件,同时保持它的引用完好无损Javascript jsonclick触发错误的对象,javascript,prototype,reference,onclick,Javascript,Prototype,Reference,Onclick,我在这里尝试的是将DOM对象与JS对象的实例相关联,这将在稍后提供一些有意义的fol方法;)此时,我只想处理我的JS对象click事件,同时保持它的引用完好无损 <?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
<?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>
在此处插入标题
//my对象,它将保存对单个DOM对象的引用
obj=功能(domobj){
这个.o=domobj;
我的=这个;
var ref=my.click;
此.o.onclick=ref;
}
//我的对象单击功能
obj.prototype.click=函数(){
警报(my.o.innerHTML);
}
//使用引用创建对象
$(文档).ready(函数(){
o1=新的obj(document.getElementById('b1');
o2=新的obj(document.getElementById('b2');
});
按钮1
按钮2
预期结果:单击按钮1时,文本“按钮1”应发出警报
当前结果:单击按钮1时,文本“按钮2”发出警报
到目前为止,我发现错误的obj实例是从click事件触发的,即使o1和o2保持对其相应DOM对象的正确引用
有什么办法解决这个问题吗
谢谢你的帮助
致以最良好的祝愿,
Clemens
my
是全局的,因此在触发click事件时,它将始终引用上次调用返回的对象
您可以将
my
设置为本地,并在obj构造函数中定义click函数。当您将函数分配给DOM元素属性(如onclick
)时,该函数中的this(调用时)将成为DOM元素。但是,您可以通过使用apply
和/或一个小闭包来改变这一点
看看这个(它仍然与您的示例非常相似,但请参见注释了解现在的情况):
//Obj具有自己的属性,包括一个很酷的DOM对象
函数Obj(domobj,名称){
this.name=(typeof name=='undefined')?'Clemens Prerovsky':name;
这个.o=domobj;
//关闭时间!保存此“this”,使用“that”
var=这个;
domobj.onclick=function(){返回that.clickHandler();};
}
//点击处理程序
Obj.prototype.clickHandler=函数(){
警报(this.o.innerHTML+',名称:'+this.name);
}
//使用引用创建对象
$(文档).ready(函数(){
var o1=新的Obj(document.getElementById('b1');
var o2=新的Obj(document.getElementById('b2'),'npup');
});
我敦促您不要错误地创建全局变量。注意声明你的变量,这样你就不会有那么多令人讨厌的意外。本例中剩下的是o1
和o2
对象
在创建循环引用时,总是会出现令人不快的意外情况,如果处理不当,就会有内存泄漏的风险。以这种方式真的需要“自定义对象”吗
HTH.大家好,谢谢你们的帮助。很明显,我不知道如何正确使用闭包,尽管意外地创建了一个全局变量:-/。需要自定义对象,因为它们表示内联编辑器的各个实例,具有各种设置(不同的格式按钮等)。不管怎样,现在我明白了,非常感谢!
<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>