Як вибрати html-вузли за ідентифікатором з jquery, коли id містить крапку?


178

Якби мій html виглядав так:

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

Як я можу вибрати # SearchBag.CompanyName з JQuery? Я не можу змусити його працювати, і я боюся, що ця точка все це порушує. Прикро, що перейменування всіх моїх ідентифікаторів було б багато роботи, не кажучи вже про втрату читабельності.

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


1
Чи період в ідентифікаторі є дійсним HTML?
клент

7
Так. Ідентифікатори можуть містити '-', '_', '.' і ':'. w3.org/TR/html4/types.html#type-name
bobince

Джипс, мої сторінки підтверджуються, за винятком подвійного тегу <title>, який створює рамка asp.net mvc ..
Борис Калленс

Відповіді:


215

@Tomalak у коментарях:

Оскільки селекторам ідентифікаторів повинен передувати хеш-номер, тут не повинно бути ніяких двозначностей

"# Id.class" - це дійсний селектор, для якого потрібен ідентифікатор, і окремий клас; це дійсно і не завжди є абсолютно зайвим.

Правильний спосіб вибору буквального "." у CSS - це уникнути цього: "#id \ .moreid". Це використовувало проблеми в деяких старих браузерах (зокрема IE5.x), але всі сучасні настільні браузери підтримують це.

Цей же метод, здається, працює в jQuery 1.3.2, хоча я не перевіряв його ретельно; quickExpr не підбирає його, але більш задіяний селекторний аналізатор, здається, підходить правильно:

$('#SearchBag\\.CompanyName');

1
"# id.class є дійсним селектором, для якого потрібен ідентифікатор, і окремий клас": Відповідно до специфікації HTML, ідентифікатори повинні бути унікальними у всьому документі. Для чого "# id.class" було б добре? Тобто, ти не можеш бути більш конкретним, ніж "#id", чи не так?
Томалак

2
@Tom: "# id.class" може бути корисним для декількох документів, використовуючи один і той же аркуш стилів, або встановлення станів із сценарієм на стороні клієнта. Наприклад, "# navhome.navselected".
bobince

@bobince: Так, клеттус придумав той же приклад, і я вважаю, що це дійсно. Все ще мені це здається дивним, і я не бачу справжньої переваги того, що вмію це робити. Особливо з огляду на HTML, що дозволяє виділяти крапки в ідентифікаторі та те, що ви завжди можете використовувати ".navselected", щоб досягти того ж.
Томалак

Наприклад, ви хочете, щоб вибраний #navhome засвітився іншим кольором до вибраного #navabout, але інші .navse вибрані властивості мають бути спільними. Я б не сказав, що ця ситуація виникає постійно, але я, безумовно, потрібна вона періодично.
bobince

3
Я думаю, що відповідь @Tomalak є більш елегантною, як:$('[id="profile.birthdate"]')
dr.dimitru

118

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

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

1
Справді. Чи можете ви сказати мені, чому ваше рішення працює, а $ ("# SearchBag.CompanyName") не працює?
Борис Калленс

9
Тому що .CompanyName трактується як вибір селектора.
клент

2
Швидко переглянувши вихідний код, це або обдумане дизайнерське рішення, або помилка. Регекс, який використовується для ідентифікації селекторів ідентифікатора (з назвою quickExpr), не включає крапку як дійсний символ. Однак специфікація HTML це дозволяє.
Томалак

5
Імовірно, корисним є вибір вибору класу на ідентифікатор. Уявіть, що у вас є елемент #menu на кожній сторінці, але ви хочете зробити його різним на одній зі своїх сторінок. # menu.hideme, наприклад? Маргінальний я знаю, але це дійсно.
клент

2
Це однозначно - найкраща відповідь. Працює також із такими змінними: $ ("tr [id = '" + private_var + "']"). Css ("background-color", "#EEEEEE");
Стів К

33

Вам не потрібно нічого уникати, якщо ви використовуєте document.getElementById:

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

getElementById передбачає, що вхід є лише атрибутом id, тому точка не буде інтерпретуватися як селектор класу.


Акуратне рішення, також чудово працює з динамічним ідентифікатором, який може містити крапки
Cookalino

17

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

Більш відповідь : Це частина документації на jquery - селектори вибору, які ви можете знайти тут: http://api.jquery.com/category/selectors/

На ваше запитання дано відповідь на початку документації:

Якщо ви хочете використовувати будь-який з мета-символів (наприклад, 
! "# $% & '() * +,. /:;? @ [\] ^` {|} ~) 
як буквальна частина імені, ви повинні уникати символу 
два зворотні риски: \\. Наприклад, якщо у вас є елемент з id = "foo.bar",
ви можете використовувати селектор $ ("# foo \\. bar"). Специфікація W3C CSS містить
повний набір правил щодо дійсних селекторів CSS. Також корисним є
запис у блозі Матіаса Байненса про послідовності втечі символів CSS для ідентифікаторів.

4
Ви розумієте, що цьому питанню більше трьох років, і документація може бути не такою ж, правда?
Реймій

9

Вибір attr здається підходящим, коли ваш ідентифікатор знаходиться в змінній:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');

4

Це задокументовано в API вибору jQuery :

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

Коротше кажучи, префікс .с \\.

$('#SearchBag\\.CompanyName')

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

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


2

Хлопці, хто шукає більш загальне рішення, я знайшов одне рішення, яке вставляє одну звороту косу рису перед будь-якими спеціальними символами, це вирішує питання, пов’язані з отриманням імені та ідентифікатора з div, який містить спеціальні символи.

"Str1.str2% str3" .замінити (/ [^ \ w \ s] / gi, '\\ $ &')

повертає "Str1 \\. str2 \\% str3"

Сподіваюся, це корисно!


1

Ви можете використовувати селектор атрибутів:

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

Або ви можете вказати тип елемента:

$("input[id='SearchBag.CompanyName']");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.