我有一些代码正常工作。我创建了一个全局数组变量z1=[];
,然后使用唯一引用键r将ZeroClipboard对象存储在数组中,并使用以下代码。 (这本身可能是邪恶的,但它有效。)
function zc(r){
var a="RP"+r,b="RDC"+r,c="RP"+r;
z1[r]=new ZeroClipboard.Client();
z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
z1[r].glue(a,b);}
我最近意识到将z1作为一个全局变量是多么的邪恶,所以我试图修改我的方式并创建一个对象以限制整个业务。但它不起作用......
我做了以下事情:
var zc={
z1: [],
add:function(r){
var a="RP"+r,b="RDC"+r,c="RP"+r;
z1[r]=new ZeroClipboard.Client();
z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
z1[r].glue(a,b);}
}
我现在正在调用zc.add(r)
而不是之前的zc(r)
。
我得到的Firebug错误是z1 is not defined
。为什么我的'add'
方法无法看到我的'z1'
属性?
[哦,之前有人问我为什么不将z1
放在zc
中,因为我从代码中的其他位置访问z1
,所以我我将向对象添加更多方法。)
答案 0 :(得分:2)
将z1[r]
更改为this.z1[r]
我可能还建议将其设置为范围中的变量以避免查找。
var zr = this.z1[r] = new ZeroClipboard.Client();
zr.addEventListener()
答案 1 :(得分:2)
z1
替换为this.r1
zc
也是一个全局变量(似乎)答案 2 :(得分:0)
zc
是你的第二个代码块中的对象文字,所以我不认为匿名函数知道该对象的成员(即它们不在同一个闭包中)。您应该创建一个新函数:
var ZC = function () {
var z1 = [];
this.add = function(r){
var a="RP"+r,b="RDC"+r,c="RP"+r;
z1[r]=new ZeroClipboard.Client();
z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
z1[r].glue(a,b);
};
};
var _zc = new ZC();
_zc.add();
这样做的好处是保持z1私有(在函数范围之外无法访问)。