2009-08-06 6 views
59

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

something[500] 

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

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

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

При дальнейшем осмотре, следующие:

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

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

Любая помощь была бы принята с благодарностью.

+2

В дополнение к правильному ответу (который является то, что вам нужно избежать скобки с двойными обратными косыми чертами), вы должны использовать ближайший() вместо нескольких вызовов parent(). Это чище и с меньшей вероятностью сломается, если уровень изменится ... Итак, если вы пытаетесь получить ближайший div, вы делаете .closest ('div') или даже лучше .closest ('div.meaningfulclassthatiwant') –

+0

Спасибо за предложение Паоло, но, как я уже говорил, я не знаю ID/класс родителя, которого я ищу раньше времени, и поскольку оба родителя являются div, ближайший не работает. Спасибо хоть. –

+0

Ах, извините, я не читал вопрос, просто посмотрел на заголовок и код в нем :) Угадайте, что мне помогает. –

ответ

82

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

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

See Special Characters In Selectors, в частности второй абзац:

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

+2

специальный (мета) символ объяснения теперь находится во втором абзаце на странице inidcated в сообщении karim79 –

+0

@KKirk - спасибо за это. – karim79

4

Попробуйте это:

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

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

Просто избежать их, и он будет найти свой элемент тонкой

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

Идентификатор не может включать квадратные скобки. Это forbidden by the spec.

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

+0

Спасибо за ссылку на спецификацию. Я понимаю, что они не являются достоверными идентификаторами, но Rails добавляет их для удобства в контроллер. –

+1

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

+0

@BryanAgee - '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Quentin

3

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

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

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

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

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

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

$("#foo\\.bar") 

"[источник: jquery doc], а элемент с ID =" Foo [бар]»(даже хотя и не действует для W3C, но признается JQuery), можно использовать селектор

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

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

Смежные вопросы