2010-10-25 4 views
1

Кто-нибудь знает хороший способ кэширования коллекции объектов, возвращаемых селектором.jQuery Collection Cache

var $platforms = $(".platforms");  
var i = 0, l = $platforms.length, current; 

for(;i<l;i++) { 
    current = $($platforms[i]); //calling jQuery() in a loop. Should be cached 
} 

Приведенный выше код создает экземпляр Jquery каждого элемента, возвращаемого $(".platform"), когда он должен быть в кэше. Есть ли простой способ сделать это?

ответ

2

Чтобы получить буквально массив JQuery оберток элементов, вы можете использовать .map() так:

var $platforms = $(".platforms").map(function() { return $(this); }).get(); 

Затем в for$platforms[i] цикле будет объект JQuery.


Это зависит от того, что вы после того, как хотя, есть .each() так:

$(".platforms").each(function(i,elem) { 
    var current = $(this); 
}); 

Или использовать .eq(), чтобы получить JQuery завернутые элемент по этому индексу в вашем цикле, как это:

for(;i<l;i++) { 
    current = $platforms.eq(1); 
} 

Все зависит от того, что вы после .... Почему вы пробиваете элементы? Большинство операций jQuery работают с наборами, а не с отдельными элементами, поэтому, например, $(".platforms").bind(...) связывается с всеми элементов, найденных селектором.

+0

Очень хорошая точка. Хотя '$ (this)' все еще вызывает функцию jQuery и в моем случае (игру), что означает много вызовов функций, которые не нужны. Вам нужно найти 'position()' для каждого. Мое текущее решение - проверить его при загрузке, затем кешировать значения в массиве, но было интересно, существует ли хорошее решение. – Louis

+1

@Louis - вы можете сохранить массив обернутой jQuery версии элементов, если вы повторяете цикл таким образом, например: 'var $ platform = $ (". Platform "). Map (function() {return $ (this);}). get(); 'тогда вы можете сделать' $ platform [i] ', и это будет обертка jQuery. –

+0

Ницца, мне это нравится! Не могли бы вы добавить его в ответ, чтобы я мог принять его. – Louis

Смежные вопросы