При обнаружении строки селектора, содержащей только селектор идентификатора, например $('#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 говорит, что не нужно идентифицировать несколько элементов с одним и тем же идентификатором, тогда, как уже упоминалось в комментариях, может произойти неопределенное поведение.В таких обстоятельствах вы можете избежать использования селектора атрибутов, который гарантирует как можно больше совпадений, но, конечно, я бы не рекомендовал идти по этому маршруту.