2

在 javascript 程序中有一个包含对象的数组 (gData)。
这些对象中的每一个都有一个称为标签的属性,它是一个对象。
每个标签在一个名为 div_ 的 div 中包含一个名为 span_ 的跨度。

在其他 gData 相关操作中,标签对象被实例化为

gData.label = new Label();

然后将 gData 对象推送到 gData 数组上。

在主程序中,我可以执行以下运行良好的 jquery 代码:

$(gData[0].label.span_).css("border","5px solid green");

我想向名为 setCSS() 的标签对象添加一个函数原型。我会这样调用 setCSS 方法:

gData[0].label.setCSS("border","5px solid green");

我编写的 setCSS 代码(如下)不起作用。我猜选择器不起作用。

Label.prototype.setCSS = function(args) {

// args contains an object in the form {"cssAtribute":"cssData"}
// call this method as label.setCSS({"border":"3px solid blue"});
// Any number of css attributes can be included in the args object

    $.each(args, function(theKey, theValue) {
        $(this.span_).css(theKey, theValue);
    });
}

我已经尝试过 $(this.span_)、$(this.div.span_) 和其他几个选择器,但都不起作用。

使用 Firebug 我可以看到 gData[0] 包含一个标签对象,而标签对象包含一个 span_ 对象。我的选择器规格错了吗?还是我错过了其他一些让我感到愚蠢的原因?

4

1 回答 1

4

this在 a 内部jQuery.each会有不同的范围。您需要先将其保存在局部变量中:

var $span = $(this.span_);
$.each(args, function(theKey, theValue) {
    $span.css(theKey, theValue);
});

请注意,您的示例.setCSS("border","5px solid green");将无法使用此方法,因为它要求参数是使用键/值的对象。

但是,您应该能够将该方法简化为:

Label.prototype.setCSS = function() {
    $.prototype.css.apply($(this.span_), $.makeArray(arguments));
};

这样你就可以像 jQuery 一样使用它,.css()包括你的实现示例。

小提琴:

第一个例子:http: //jsfiddle.net/ESrSY

第二个例子:http: //jsfiddle.net/UpEPK

于 2012-05-25T07:57:04.950 回答