Самый простой способ создать набор объектов jquery - PullRequest
10 голосов
/ 28 сентября 2011

Да, я так и делал

   A.add(B).add(C).add(D).show()

Хотя A, B, C, D являются объектами jQuery. Интересно, есть ли такой простой способ сделать это там? Я перепробовал все следующие подходы, но безрезультатно:

$(A,B,C,D).show()
A.add(B,C,D).show()

Все предложения приветствуются!


Дополнение для уточнения вопроса:

Часть ".show ()" только для демонстрации. Я просто хотел узнать, как я могу создать набор объектов JQuery, таких как $ ('p'), создать набор тегов p.

В моем реальном случае я использовал

$([A,B,C,D]).each(fn)

вместо .show () (И мне интересно, почему это сработало?) Очевидно, что

$([A,B,C,D]).each(fn)
$('p').each(fn)

оба работают. Но

$([A,B,C,D]).show()  //--doesn't work
$('p').show()        //--works

Просто вторая строка работает. Кто-нибудь знает разницу между ними? (Я просто подумал, что они одинаковые, а потом немного запутался в моем вопросе)

Ответы [ 4 ]

10 голосов
/ 28 сентября 2011
$.each([A,B,C,D], function(){ 
    $(this).css('background','red'); 
})

Вместо использования селектора это решение использует метод jQuery с именем $. Каждый , который принимает массив и выполняет итерации по нему. Переданный массив представляет собой набор объектов jQuery. $(this) ссылается на объекты jQuery, которые повторяются каждый раз.

демо: http://jsfiddle.net/SCjMc/1/


Другие факты о том, как работает $ ():

$(element) является сокращением для jQuery(element). Метод jQuery() принимает другой набор параметров:

enter image description here

Описание для каждого типа параметра можно найти в этой ссылке .

Одним из типов параметров является "elementArray". Описание этого:

elementArray Массив, содержащий набор элементов DOM для переноса в объект jQuery.

Подвох в том, что когда вы используете jQuery для выбора элемента, это возвращает объект jQuery, а не элемент DOM напрямую. Следовательно, не возвращает любые элементы:

var element1 = $("selector1");
var element2 = $("selector2");
$([element1,element2]) // will not return any elements

Чтобы вернуть элемент DOM вместо объекта jQuery, вам нужно получить доступ к свойству в позиции 0 объекта jQuery. Следующим образом: $("element")[0]. И вот почему это будет работать:

var element1 = $("selector1")[0]; //accessing dom element 
var element2 = $("selector2")[0]; //from jQuery object
$([element1,element2])
1 голос
/ 28 сентября 2011

Вот самая короткая версия, о которой я мог подумать:

A.add([B[0], C[0], D[0]]).show();

Это передает массив элементов, а не объектов jQuery.Работает только если B, C и D - одноэлементные массивы.

http://jsfiddle.net/nrabinowitz/Jb6VD/1/

0 голосов
/ 28 сентября 2011

Чтобы получить набор, полученный в результате объединения нескольких объектов jQuery (которые являются в некотором смысле «просто» массивами), вы можете использовать $.merge:

var union = $.merge( $.merge(A,B), $.merge(C,D) );

$.merge работает только напара массивов, поэтому использование этого для большого количества объектов jQuery может быть очень утомительным ... в этом случае вы можете использовать $().get() для получения «сырого» массива и concat их вместе:

var union = $([].concat(A.get(), B.get(), C.get(), ...));
// Assuming A, B, C... are jQuery objects
0 голосов
/ 28 сентября 2011

Если у вас есть необработанные элементы DOM ( не jQuery-объекты, такие как $('#abc') или $('.abc')), вам не нужно использовать add:

$([A,B,C,D]).show();

См.подробности о функции $(...).


Если вы действительно хотите что-то вроде $(A,B,C,D), где A,B,C,D - это объекты jQuery, тогдаЕдинственный реальный способ - это запустить свою собственную функцию.

Это делает трюк:

var all = function() {
    var objs = $();
    $.each(arguments, function(i,e) {
        objs = objs.add(e);
    });
    return objs;
};

// ...

all(A,B,C,D).show();

Рабочий пример: http://jsfiddle.net/Jb6VD/5/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...