2009-08-06 74 views
59

我有類似ID的DOM元素:當ID包含方括號時,通過ID查找DOM元素?

something[500] 

這是我的Ruby on Rails應用程序構建。我需要能夠通過jQuery獲取這個元素,以便我可以遍歷DOM的方式來刪除它的父項的父項,該項的父項有一個我事先無法訪問的變量ID。

有誰知道我該怎麼做呢?下面的代碼似乎並不奏效:

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

經過進一步檢驗,如下:

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

返回一個對象,但是當我運行名「.html()」或」的.text ()「,結果總是爲空或者只是一個空字符串。

任何幫助將不勝感激。

+2

除了正確的答案(這是你需要逃避使用雙反斜槓的括號),你應該使用nearest()而不是多個parent()調用。如果一個級別發生變化,它更乾淨,不太可能破壞...所以,如果你想獲得最接近的div,你可以使用.closest('div')甚至更好.closest('div.meaningfulclassthatiwant') – 2009-08-06 14:16:04

+0

感謝Paolo的建議,但正如我所提到的,我不知道我正在尋找的父母的ID /類,因爲父母都是div,所以最接近的就不行。不過謝謝。 – 2009-08-06 14:49:17

+0

啊,對不起,我沒有看過這個問題,只是看了看標題和代碼:)猜猜這對我有幫助。 – 2009-08-06 14:53:09

回答

82

您需要轉義方括號,以便它們不被視爲屬性選擇器。試試這個:

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

See Special Characters In Selectors,特別是第二段:

使用任何元字符(如!"#$%&'()*+,./:;<=>[email protected][\]^``{|}~)作爲名稱的文字部分,它必須與逃脫兩個反斜槓:\\。例如,具有id="foo.bar"的元素可以使用選擇器$("#foo\\.bar")。 W3C CSS規範包含complete set of rules regarding valid CSS selectors。 Mathias Bynens的博客條目CSS character escape sequences for identifiers也很有用。

+2

特殊(元)字符解釋現在在karim79的帖子中註明的頁面的第二段 – 2010-06-11 13:52:48

+0

@KKirk - 謝謝你。 – karim79 2010-06-11 21:42:22

4

試試這個:

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

方括號具有特殊含義jQuery selectors,屬性明確的過濾器。

只是逃避這些,它會找到你的元罰款

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

一個ID 不能包括方括號。這是forbidden by the spec

某些瀏覽器可能會錯誤糾正並應對,但您應該修復您的數據,而不是嘗試處理錯誤的數據。

+0

感謝您的規範鏈接。我意識到它們不是有效的ID,但Rails爲了方便起見在控制器中添加了它們。 – 2009-08-06 14:29:12

+1

不僅僅是rails - 許多Web應用程序都使用這個技巧,因爲它允許表單處理程序遍歷數組,而不是佔用已提交的大量可選行。 – 2013-04-23 00:30:30

+0

@BryanAgee - 'id's不是'name's,並且大多數表單處理程序庫都使用counting來迭代具有相同名稱的多個控件,而不是特殊的命名約定或占卜。 – Quentin 2013-04-23 04:59:48

3

您可以使用它們或\\你可以做這樣的事情逃脫

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

「任何的元字符

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

作爲名稱的文字部分,必須用兩個反斜槓進行轉義:\\

例如,使用id = 「foo.bar」 元件時,可以使用選擇器

$("#foo\\.bar") 

「[來源:jquery doc],和使用id =一個元件爲」 foo [巴]」(甚至雖然沒有有效的W3C但JQuery的認可),可以使用選擇

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

(只是一個asnwer像許多人一樣,但都在一起:))

相關問題