Это лучший способ запросить элемент и его дочерние элементы? - PullRequest
0 голосов
/ 29 мая 2010

Я пытаюсь запросить элемент и его потомков, чтобы найти идентификаторы, которые начинаются с определенной строки.

var foundIDs = containerElement.find('[id^=something]').andSelf().filter('id^=something');

Метод find() ищет только потомков, поэтому я решил попробовать andSelf(). Однако andSelf() не берет селектор. Это означает, что элемент контейнера включается независимо от того, соответствует ли он поисковому запросу или нет, и тогда я должен выполнить на нем вторичный filter(), чтобы удалить элемент контейнера, если он не совпадал.

Я попытался поместить andSelf() перед find(), но, похоже, он не поднял элемент контейнера в стек.

containerElement.andSelf().find('[id^=something]');

Есть ли лучший способ добиться того, что я делаю?

Ответы [ 4 ]

1 голос
/ 30 мая 2010

Этот ответ имеет лучшую производительность, чем мой другой ответ, но вы теряете способность цепочки, которую предлагает ваш принятый ответ.

    // Do a typical find.
var found = containerElement.find('[class^=something]');

    // Test the containerElement directly,
    //    and push it into the 'found' object if it matches.
if( containerElement.is('[class^=something]') ) found.push(containerElement);
1 голос
/ 29 мая 2010
containerElement.find('*').andSelf().filter('[id^=something]');
1 голос
/ 30 мая 2010

Я знаю, что вы уже приняли ответ, но я все равно его выброшу.

var foundIDs = containerElement.wrap('<div>')             // Wrap
                               .parent()                  // Traverse up
                               .find('[id^=something]');  // Perform find

containerElement.unwrap();  // DOM is untouched

Поскольку вы разворачиваете containerElement до завершения функции, DOM остается нетронутым (на случай, если вам интересно).

Я проверил это с помощью плагина livequery, который никогда не обнаруживает новый div.

Если вы зарегистрируете идентификатор (или любой другой) найденных идентификаторов, вы увидите, что верхним уровнем является ваш containerElement (если он соответствует критериям .find().

console.log( foundIDs.attr('id') );  // Log the ID of the root element.

EDIT:

Что касается тестирования, я выполнил итерационный цикл 1000 в обеих версиях против containerElement только с 2 вложенными элементами.

Я тестировал только в Safari на Mac.

Принятый ответ был примерно в 7 раз быстрее.

Если я добавил 100 вложенных элементов, разрыв сократился менее чем в 2 раза.

Вот проблема. Обе версии вернули 0 элементов, если containerElement не совпадает. Я не уверен, почему это так.

1 голос
/ 29 мая 2010

Просто с макушки головы (не проверено):

var foundIDs = containerElement
                     .filter('id^=something')
                     .add(containerElement.find('id^=something'));

Это не намного эффективнее, чем ваши первые попытки, но я думаю, что это немного чище.

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