Как выбрать узлы HTML по идентификатору с помощью jquery, когда идентификатор содержит точку? - PullRequest
172 голосов
/ 03 марта 2009

Если мой HTML выглядел так:

<td class="controlCell">
    <input class="inputText" id="SearchBag.CompanyName" name="SearchBag.CompanyName" type="text" value="" />
</td>

Как я могу выбрать # SearchBag.CompanyName с JQuery? Я не могу заставить это работать, и я боюсь, что это - точка, которая ломает все это. Раздражает то, что переименование всех моих идентификаторов будет большой работой, не говоря уже о потере читабельности.

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

Ответы [ 8 ]

209 голосов
/ 03 марта 2009

@ Томалак в комментариях:

, поскольку селекторам идентификаторов должен предшествовать хэш #, здесь не должно быть никакой двусмысленности

«# id.class» является допустимым селектором, для которого требуется соответствие идентификатора и отдельного класса; он действителен и не всегда полностью избыточен.

Правильный способ выбора литерала «.» В CSS - это экранировать его: «#id \ .moreid». Раньше это вызывало проблемы в некоторых старых браузерах (в частности, IE5.x), но все современные браузеры для настольных компьютеров поддерживают его.

Похоже, что тот же метод работает в jQuery 1.3.2, хотя я не проверял его полностью; quickExpr не подхватывает его, но более сложный синтаксический анализатор выбора, кажется, делает это правильно:

$('#SearchBag\\.CompanyName');
116 голосов
/ 03 марта 2009

Один вариант будет таким:

$("input[id='SearchBag.CompanyName']")
29 голосов
/ 06 июня 2013

Вам не нужно ничего избегать, если вы используете document.getElementById:

$(document.getElementById('strange.id[]'))

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

16 голосов
/ 02 августа 2012

Короткий ответ : Если у вас есть элемент с id = "foo.bar", вы можете использовать селектор $("#foo\\.bar")

Более длинный ответ : Это часть документации jquery - селекторы разделов, которые вы можете найти здесь: http://api.jquery.com/category/selectors/

На ваш вопрос ответят в самом начале документации:

If you wish to use any of the meta-characters ( such as 
!"#$%&'()*+,./:;?@[\]^`{|}~ ) 
as a literal part of a name, you must escape the character with 
two backslashes: \\. For example, if you have an element with id="foo.bar", 
you can use the selector $("#foo\\.bar"). The W3C CSS specification contains 
the complete set of rules regarding valid CSS selectors. Also useful is the 
blog entry by Mathias Bynens on CSS character escape sequences for identifiers.
8 голосов
/ 20 сентября 2014

Выбор атрибута кажется подходящим, когда ваш идентификатор находится в переменной:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');
4 голосов
/ 04 февраля 2015

Это задокументировано в API селектора jQuery :

Для использования любых метасимволов (таких как !"#$%&'()*+,./:;<=>?@[\]^`{|}~) как буквальная часть имени, оно должно с двумя обратными слешами: \\. Например, элемент с id="foo.bar", можно использовать селектор $("#foo\\.bar").

Короче, префикс . с \\.

$('#SearchBag\\.CompanyName')

Проблема в том, что . будет соответствовать классу, поэтому $('#SearchBag.CompanyName') будет соответствовать <div id="SearchBag" class="CompanyName">. Экранированный с \\. будет рассматриваться как обычный . без особого значения, соответствующего желаемому ID.

Это относится ко всем символам !"#$%&'()*+,./:;<=>?@[\]^`{|}~, которые в противном случае имели бы особое значение как селектор в jQuery.

2 голосов
/ 04 августа 2013

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

"Str1.str2% str3" .replace (/ [^ \ w \ s] / gi, '\\ $ &')

возвращает "Str1 \\. Str2 \\% str3"

Надеюсь, это полезно!

1 голос
/ 14 марта 2016

Вы можете использовать селектор атрибута:

$("[id='SearchBag.CompanyName']");

Или вы можете указать тип элемента:

$("input[id='SearchBag.CompanyName']");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...