2010-01-07 2 views
12

Я пытаюсь выбрать элемент HTML на своей странице с определенным классом и идентификатором. Вот тег:JQuery Селекторы: как выбрать элемент с определенным классом * и * id

<div class="statusLight" id="green"></div> 

Я попытался это не повезло:

$statusLight = $('.statusLight#green'); 

Я знаю, что я мог бы просто сказать

$statusLight = $('#green'); 

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

+5

Почему вы хотите выбрать класс, если знаете ID? По дизайну идентификаторы уникальны, поэтому это был бы самый быстрый способ выбора элемента. – cfbarbero

+1

Не понимаю. Идентификатор должен быть UNIQUE и завершить всю фильтрацию. Применение чего-либо + id должно быть точно таким же, как выбор только по идентификатору. Зачем вам это делать? –

+0

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

ответ

17

И #green.statusLight, и .statusLight#green являются действительными селекторами и должны выбрать элемент, который вы ищете. Сначала будет быстрее.

Вы используете $(...) после загрузки вашего документа, то есть от $(document).ready(function() { ... }) или путем размещения сценария после вашего элемента?

+0

Спасибо, Питер за быстрый ответ. На самом деле это была опечатка с «Светом» вместо «света». Оба метода, которые вы дали, закончили работу. – BAHDev

11

Я не совсем уверен, почему вы хотели бы это сделать.

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

Этот сценарий имеет смысл только в том случае, если вы комбинировали селектор классов с селектором элементов, например.

$("div.statuslight") 

Но в вашем примере просто нет смысла, поскольку у вас есть удостоверение личности в любом случае!

+0

Джеймс, я согласен с тобой. На самом деле это больше читаемость в моем коде, но вы правы. Все идентификаторы уникальны в любом случае, поэтому зачем их фильтровать больше? Моя проблема в конечном итоге была опечаткой, кстати. – BAHDev

+8

Существует случай, когда вы хотите делегировать событие для элемента только тогда, когда у него есть класс. Скажем, у вас есть элемент drag'n'drop, и вы хотите, чтобы его можно было щелкнуть, когда ему был присвоен определенный класс (через какое-то взаимодействие). –

3

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

+0

@ Парроты, я согласен. Это скорее читаемость в моем коде, чем функциональная необходимость. Спасибо за совет. – BAHDev

+6

Одной из причин этого может быть тот факт, что класс элемента изменяется, и он хочет выбрать элемент только тогда, когда он дал класс. (Хорошо, просто догадываюсь, но дело в том, что для этого могут быть причины). [повторяет тот же комментарий, что и выше] –

0

Еще одна причина, по которой вы, вероятно, сделаете это, - это иметь общий кешированный код, ищущий определенный идентификатор, но вы хотите активировать его только при назначении определенного стиля. Особенно, когда вы выполняете рендеринг scololded MVC-элементов, где идентификаторы могут находиться в определенных представлениях, но вы не хотите принимать действия, скажем ... «скрытые» поля id, но в других представлениях это могут быть значения поиска в комбо и иметь Аддин выбор2 назначен ...

0

Самый простой способ:

$('.statusLight[id=green]');

Поскольку идентификатор является атрибутом вы можете использовать селектор атрибута

2

$(".class#id") или $("#id.class") оба будут работать.

Все комментарии в этом вопросе состоят в том, что нет оснований для этого ... не может быть причины «лучшей практики», чтобы сделать это с хорошо продуманной программой, но в реальном мире большинство из нас работает на компании, у которых есть кодовые базы, которые не очень хорошо организованы, и если вы работаете с большой файловой программой 10000+, вы можете не захотеть заменить не описательный идентификатор и добавив класс в селектор, который вы можете помочь своим коллегам-кодорам понять откуда пришел идентификатор.

Дело в точке, я работаю над проектом, где мы имеем контейнер DIVs, которые создают «виджеты» на странице ... эти «виджеты» дают числовой идентификатор из базы данных, поэтому мы конец с <div id="12345" class="widget">

Кто-то еще долго кодировал неоднозначный идентификатор, прежде чем я работал здесь ... но он остается. Когда я пишу JQuery, я бы предпочел не делать больше путаного беспорядка кода ... поэтому вместо $("#12345") я мог бы предпочесть $(".widget#12345"), так что кому-то не нужно тратить полчаса, пытаясь понять, что 12345 id в этом сценарии для виджета.

Итак, пока $("#12345") и $(".widget#12345") выберите то же самое ... это делает код более читаемым для моих сотрудников, и это более важно, чем доля секунды в улучшении скорости для javascript.

+0

Действительно! Другой вариант использования, я использую подстановочные знаки в своем ID-селекторе [id^= lightbox_flex_field_flex_field_], и в некоторых случаях вам нужно получить класс, чтобы различать, так как пользователи могут сами определять типы полей ... – rept

0

Просто прослеживание FYI:

Если вы хотите вставить ссылку на идентификатор и суб-класса (например, зеленый statusLight, но не синий):

<div id="green"> 
    <div class="statusLight"></div> 
</div> 

<div id="blue"> 
    <div class="statusLight"></div> 
</div> 

Затем вам нужно добавить a пробел $("#green .statusLight")