0
var collection = $('ul li');
collection.each(function (index) {
    var test = $.extend($(this), {
    // var test = $.extend(collection.eq(index), {
        someProperty: 'val'
    });
    console.log(test.someProperty);
});
console.log(collection.eq(0).someProperty);

和测试:http: //jsfiddle.net/simo/G3yCr/1/

我正在尝试扩展 jquery 集合中的每个对象。我想直接从集合中的每个项目访问属性。

问题是为什么collection.eq(index)对象没有得到扩展。注释行是替代的,并给出相同的结果。

规范:http ://api.jquery.com/jQuery.extend/

4

2 回答 2

0

在您的.each函数this中指的是集合中的单个 DOM 元素,而不是 jQuery 对象。

然后,当您调用时$(this),您正在创建一个的jQuery 对象,它不是集合中的那个。

使这个附加属性保持不变的最简单方法是将其添加到元素本身。或者用于.data()存储和检索附加属性。

在 ES5 浏览器上,你可以使用(可能是讨厌的)hack 让你.data()看起来像一个真实的财产:

(function($) {
    Object.defineProperty($.fn, 'foo', {
        get: function() {
            return $(this).data('foo');
        },
        set: function(v) {
            $(this).data('foo', v);
        }
    });
})(jQuery);

$('#d1').foo = 'bar';
$('#d2').foo = 'wot';

alert([$('#d1').foo, $('#d2').foo]);

请注意(AFAIK)没有其他 jQuery 代码添加属性(除了.length)在 jQuery 对象上。使用此技巧可能会使其他开发人员感到困惑。

于 2012-08-25T22:12:35.250 回答
0

简单的。只需阅读jQuery Plugin Authoring

$.fn.someProperty = 'val';
var collection = $('ul li');
console.log(collection.eq(0).someProperty);​

不需要对整个集合进行迭代。

于 2012-08-25T22:19:03.693 回答