用这个。在jquery选择器中

时间:2012-05-25 07:53:58

标签: javascript jquery jquery-selectors

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

在其他与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_对象。我的选择器规格错了吗?还是我错过了一些让我感到愚蠢的其他原因?

1 个答案:

答案 0 :(得分:4)

this内的

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