2012-08-25 29 views
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的擴展 - 目標對象沒有得到延長

我想每個對象擴展jQuery的內部集合。我想直接從集合中的每個項目訪問屬性。

問題是爲什麼collection.eq(index)對象沒有得到擴展。註釋行是可選的,並提供相同的結果。

該規範:http://api.jquery.com/jQuery.extend/

+1

你正在擴展一個jQuery實例(這是'$(this)'返回的) - 並且每個回調完成後,這個實例就會消失。所以你實際上並沒有擴展「收藏」。 – Niko

+0

好的,但即使使用下面的註釋行,測試也會失敗:'var test = $ .extend(collection.eq(index)''不會被擴展嗎? – simo

+0

@simo'collection.eq(index)'_also_創建一個新的jQuery對象 – Alnitak

回答

0

在你.each功能this指的是從收集個人DOM元素,而不是一個jQuery對象。

當您然後致電$(this)您正在創建一個新的 jQuery對象,它不是集合中的一個。

使這個附加屬性保持最簡單的方法是將其添加到元素本身。或者使用.data()來存儲和檢索附加屬性。

在ES5的瀏覽器就可以使用一個(可能是討厭)黑客以使您的.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]); 

注意,(據我所知)沒有其他jQuery代碼增加了性能(比.length)其他一個jQuery對象這一招的使用可能會混淆其他開發商

+0

詳細闡述一下:實際元素只能通過「僞數組」語法'collection [index]'(不通過'eq(index)'!)來獲得 - http://jsfiddle.net/ G3yCr/2/ – Niko

+0

@Niko或只是'這個' – Alnitak

+0

是的,我知道這個工程,但我想訪問這樣的對象:'collection.eq(0).prop'不''collection.eq(0)[0] .prop' – simo

0

簡單剛上jQuery Plugin Authoring讀了起來:。

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

不需要迭代整個集合。

+1

這會給_every_ jQuery對象相同的值,該屬性,這是毫無意義的... – Alnitak

+0

確實...然而從這個問題的例子我明白,這正是作者所追求的。 – zzen

相關問題