Найти элемент 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\\]")
(Просто как много других, но все вместе:))