Найти элемент DOM по ID, если ID содержит квадратные скобки?

У меня есть элемент DOM с идентификатором, похожим на:

something[500]

который был построен моим приложением Ruby on Rails. Мне нужно иметь возможность получить этот элемент через jQuery, чтобы я мог пройти по DOM, чтобы удалить родителя его parent, у которого есть идентификатор переменной, к которому у меня нет доступа заранее.

Кто-нибудь знает, как я мог пойти по этому поводу? Следующий код не работает:

alert($("#something["+id+"]").parent().parent().attr("id"));

При дальнейшей проверке следующее:

$("#something["+id+"]")

возвращает объект, но когда я запускаю на нем ".html()" или ".text()", результат всегда равен нулю или просто пустой строке.

Ответ 1

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

alert($("#something\\["+id+"\\]").parent().parent().attr("id"));

См. Специальные символы в селекторах, в частности второй абзац:

Чтобы использовать любой из метасимволов (например, !"#$%&'()*+,./:;<=>[email protected][\]^``{|}~) в качестве литеральной части имени, он должен быть экранирован с двумя обратными косыми чертами: \\. Например, элемент с id="foo.bar" может использовать селектор $("#foo\\.bar"). Спецификация CSS W3C содержит полный набор правил относительно правильных селекторов CSS. Также полезной является запись в блоге Матиаса Биненса о escape-последовательности символов CSS для идентификаторов.

Ответ 2

Квадратные скобки имеют особый смысл селектора jQuery, специальные фильтры атрибутов.

Просто сбегите от них, и он найдет ваш элемент в порядке

$( "#something\\[" + id + "\\]" )

Ответ 3

Идентификатор не может включать квадратные скобки. запрещено спецификацией.

Некоторые браузеры могут исправить ошибки и справиться, но вы должны исправить свои данные вместо того, чтобы пытаться справиться с плохими данными.

Ответ 4

Вы также можете сделать

$('[id="something['+id+']"]')

Ответ 5

Попробуйте следующее:

alert($("#something\\["+id+"\\]").parent()[0].parent()[0].attr("id"));

Ответ 6

Вы можете избежать их с помощью \\ или вы можете сделать что-то вроде этого...

$(document.getElementById("something[" + id + "]"))

Ответ 7

"Любой из метасимволов

!"#$%&'()*+,./:;<=>[email protected][\]^`{|}~

как литеральную часть имени, он должен быть экранирован двумя обратными косыми чертами: \\.

Например, элемент с id = "foo.bar" может использовать селектор

$("#foo\\.bar")

"[источник: jquery doc] и элемент с id =" foo [bar]" (хотя он недействителен для W3C, но распознанный JQuery), может использовать селектор

$("#foo\\[bar\\]")

(Просто как много других, но все вместе:))