Является ли css-селектор # <my-id> (предполагается, что) на 100% эквивалентным [id = <my-id>] в jQuery? - PullRequest
3 голосов
/ 05 мая 2011

Немного предыстории: У меня есть сайт с таблицей, отображающей список сущностей.Используя jQuery, я делаю возможным щелкнуть строку в таблице, которая загрузит некоторые дополнительные данные о выбранной сущности, используя AJAX.Новая строка вставляется в таблицу под строкой, по которой щелкнули.Эта строка содержит более подробную информацию о сущности и не является строкой, просто в терминах HTML.Он содержит целую кучу данных.При щелчке по другой строке показанная строка сведений будет скрыта, а строка сведений о вновь выбранном объекте отображается (загружается с помощью AJAX, если еще не загружен).Здесь нет проблем.

В строке сведений также есть поле выбора.После загрузки строки сведений с помощью Ajax я хочу связать событие onchange выбора.Я делаю следующее выделение jQuery:

$("tr.entity_details[data-entity-id=" + entityId + "] select#SelectedDropDownValue")

Проблема: Это также работает нормально, за исключением некоторых очень специфических случаев (которые я еще не смог полностью определить).Иногда он не выбирает элемент select.Я использую VS2010 для отладки и ввел эти два элемента в окно просмотра:

$("tr.entity_details[data-entity-id=" + entityId + "] select#SelectedDropDownValue").length
$("tr.entity_details[data-entity-id=" + entityId + "] select[id=SelectedDropDownValue]").length

В тех случаях, когда первый ничего не выбирает, второй делает .Это действительно странно для меня, потому что я думал, что эти два селектора эквивалентны.

Ситуация, когда я мог создать это: у меня есть две сущности в моей таблице.

  • Сначала я нажимаю на нижнюю: без проблем;затем я нажимаю на верхнюю: без проблем.
  • Сначала я нажимаю на верхнюю: без проблем;затем я нажимаю на нижнюю: ПРОБЛЕМА.

Я понятия не имею, что может вызвать это.Я думаю, может быть, что-то со мной, вставляя новые строки и скрывая их в javascript, в результате чего выбор немного сбился.Но это было бы ошибкой, я полагаю.Или, может быть, это как-то связано с тем, что строка сведений содержит другую таблицу, а селектор находится внутри этой внутренней таблицы.

РЕДАКТИРОВАТЬ:

Чтобы добавить дополнительную информацию.Я проверял это под IE9 и Chrome.Я занимаюсь разработкой приложения ASP.NET MVC 3 с использованием jQuery 1.5.1.Строка сведений генерируется частичным представлением.В этом частичном представлении я использую Html Helper DropDownListFor.Этот помощник генерирует элемент select на основе свойства C #, которое вы передаете функции.Он использует имя свойства для генерации имени и идентификатора элемента.Это приводит к тому, что все выбранные элементы на странице имеют одинаковый идентификатор.Как уже упоминали некоторые люди, это может быть причиной.

Ответы [ 3 ]

4 голосов
/ 05 мая 2011

Я работаю на сайте, который, ну, не соответствует.У нас есть много HTML-элементов с одинаковым идентификатором.Я заметил, что $('#someid') захватывает только первый элемент, который он находит с этим идентификатором, в то время как $('[id="someid"]') захватывает все элементы с этим идентификатором.

3 голосов
/ 22 января 2013

При обнаружении строки селектора, содержащей только селектор идентификатора, например $('#my-id'), jQuery передает этот идентификатор непосредственно в document.getElementById(), чтобы получить первый элемент с этим идентификатором, без каких-либо дополнительных шагов.Это известный и хорошо документированный факт .

Если в селекторе есть что-то еще, jQuery полностью пропускает вызов document.getElementById().Если браузер поддерживает document.querySelectorAll(), а селектор является поддерживаемым селектором CSS, то jQuery будет использовать этот API для запроса DOM, даже не используя собственный движок Sizzle.В противном случае он откладывается на Sizzle.

Теперь, что касается селекторов CSS, селектор идентификатора должен всегда соответствовать элементу , пока он идентифицируется этим идентификатором , независимо от того, является ли HTMLговорит, что недопустимо иметь более одного такого элемента в одном документе.См. этот ответ для объяснения.Я не совсем уверен, будет ли Sizzle вести себя так же, но весьма вероятно, что нативная реализация будет вести себя как таковая.Конечно, поскольку разметка должна быть недействительной, чтобы иметь значение, на это не следует полагаться.

Селектор атрибутов, такой как $('[id=my-id]'), с другой стороны, делаетне несет ту же семантику, что и селектор идентификатора.Это не означает «(или любой) элемент, который идентифицирован как my-id»;скорее он просто выбирает любой элемент с атрибутом, который называется id, со значением my-id.Таким образом, в jQuery и CSS, и независимо от семантики документа, он всегда соответствует любому элементу , если он имеет этот атрибут и значение .

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

0 голосов
/ 05 мая 2011

идентификаторы часто злоупотребляют. Если вы внедряете новые DOM-узлы с помощью JavaScript, вероятно, существует момент, когда у вас есть узел внутри переменной. Вы можете просто прикрепить обработчик события к переменной; нет необходимости назначать идентификатор, вставлять узел в документ и затем искать его по идентификатору.

...