2012-02-10 2 views
1

Есть ли альтернатива строкам выбора селектора в jquery?JQuery: Альтернатива строкам выбора селектора?

В частности, я пытаюсь извлечь информацию из меток нескольких элементов формы, поэтому мне нужно создать запросы, такие как $('[for=#id]'). Кажется неэлегантным (и, вероятно, неэффективным), чтобы создавать строки запроса на каждом проходе каждой итерации над элементами формы.

Единственный похожий вопрос, который я могу найти, это jQuery (anti-)pattern: building selectors with string manipulation, который не имеет полезных ответов.

+0

Ну, вы можете выбрать ярлык по его местоположению относительно элемента формы, который вы итерируете. Например, если метка немедленно предшествует элементу формы, вы можете просто использовать 'element.prev()' –

+0

. У меня возникают проблемы с контекстом того, что вы хотите, можете ли вы показать мне какой-нибудь html и что вы пытаетесь получить ? – mcgrailm

ответ

1

По меньшей мере ограничьте поиск в той форме, в которой вы находитесь. Поиск по атрибутам неэффективен, потому что вы должны перебирать каждый элемент корневого набора элементов. поэтому вместо того, чтобы искать каждый элемент в DOM, ограничить поиск:

var forID = $('#my-form').find('[for=#id]'); 

Вы можете сделать это немного быстрее с помощью функции поиска для этикеток внутри формы, затем фильтруют вниз только то, что вы хотите:

var $allLabels = $('#my-form').find('label'); 

//then you can find a specific element by searching in the $allLabels object. 
$allLabels.filter('[for="#id"]'); 

Если ваши метки не изменяются динамически, вы должны кэшировать их выбор за пределами своего цикла; всегда значения кэша, которые не изменяются внутри цикла, вне цикла.

+0

Спасибо. Я собираюсь оптимизировать много кода. – Marcin

+0

Кроме того, во второй строке это правильный синтаксис? Если это так, замечательно. – Marcin

+0

@Marcin Я предполагаю, что вы имеете в виду 'var $ allLabels = $ ('# my-form'). Find ('label');'. Это начинается с выбора формы по id, что очень быстро, а затем находит все элементы «label» в форме, что также довольно быстро для браузеров, которые имеют «getElementByTagName», и эти элементы «label» сохраняются в ' $ allLabels' для доступа к вам позже. Имейте в виду, что для поиска одной метки или группы меток внутри переменной $ allLabels вам нужно использовать '.filter()' вместо '.find()', потому что у вас есть список элементов, а не вложенных элементов ('.find()' ищет потомков). – Jasper

0

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

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