0

好吧,我承认一开始我有点过头了。

我有一些代码工作正常。我创建了一个全局数组变量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'属性?

[哦,在有人问我为什么不z1zc原样输入之前,那是因为我z1从代码中的其他地方访问,所以我要为对象添加更多方法。)

4

3 回答 3

2

更改z1[r]this.z1[r]

我可能还建议将其设置为范围内的变量以避免查找。

var zr = this.z1[r] = new ZeroClipboard.Client();
zr.addEventListener()
于 2012-04-09T02:31:59.507 回答
2
  1. 将出现替换z1this.r1
  2. 也许我误解了你的努力,但zc也是一个全局变量(似乎)
于 2012-04-09T02:33:25.277 回答
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 私有的优点(在函数范围之外无法访问)。

于 2012-04-09T02:33:15.233 回答