2013-03-23 26 views
2

當我使用什麼使jQuery無法通過它的id獲取dom?

alert(j(this).attr("id")); 

我可以看到彈出窗口顯示出來_denominations[3].id.denominationId

但是當我打電話

alert(j('#_denominations[3].id.denominationId').attr("id")); 

彈出窗口顯示我'undefined',實際的HTML DOM是看起來像這樣:

<div class="form-field"> 
    <select id="_denominations[3].id.denominationId" class="removableDenom" name="denominations[3].id.denominationId"> 
</div> 

那麼有什麼機會可能使undefined彈出發生

+1

我最初的想法是你不能有那些句號和括號。也許。 – 2013-03-23 17:51:18

+0

我想過[這很熟悉](http://stackoverflow.com/questions/5899881/jquery-selector-for-select-with-id1) – 2013-03-23 17:54:35

回答

4

嘗試轉義ID值本身的句點和括號。所以,你的價值:

'#_denominations[3].id.denominationId' 

變爲

'#_denominations\\[3\\]\\.id\\.denominationId' 

這可能是因爲jQuery是用類混淆這些和屬性選擇。

例子:http://jsfiddle.net/jonathansampson/ZUMna/

+0

轉義時需要雙斜線('\\。')選擇。 – JJJ 2013-03-23 17:53:18

+1

@Juhana,是的,這也是我[類似問題]的答案(http://stackoverflow.com/questions/5899881/jquery-selector-for-select-with-id1)。 – 2013-03-23 17:55:10

+0

@Jonathan Sampson謝謝,但'j'('#'+ obj.attr('id'))。attr('id')'沒有轉義工作嗎? – Dreamer 2013-03-23 18:00:36

3

你需要躲避特殊字符ID..that是[]. ....因爲jQuery的需要[]爲屬性選擇和.爲類選擇..

嘗試此

alert(j('#_denominations\\[3\\]\\.id\\.denominationId').attr("id")); 
+3

除了你需要逃避兩次,一次爲JS字符串,一次爲jQuery選擇器。 – 2013-03-23 17:54:16

+1

oooo yes ..謝謝你.. :) ..更新.. – bipen 2013-03-23 17:56:55

1

jQuery是假設那些[]是一個屬性選擇器,而不是ID的一部分; special characters必須逃脫。 []aren't actually allowed在HTML5之前的HTML ID,這可能會導致你的其他問題 - 我見過document.getElementById失敗,因爲ID在一個較舊的瀏覽器中以數字開頭,例如,即使是HTML5文檔類型。

+1

HTML5中允許使用方括號(鏈接到HTML4規範),並且時段也必須轉義。 – JJJ 2013-03-23 17:59:00

+1

對此沒有理由否定,你是對的。 – 2013-03-23 17:59:31

1

另一個捷徑。

j('[id="_denominations[3].id.denominationId"]') 
+1

這會起作用,但與直接選擇id相比,速度非常慢,因爲jQuery必須遍歷頁面上的每個元素,而不是使用本地'getElementById()'。 – JJJ 2013-03-23 18:07:28

+0

功能性強,但它擊敗了Sizzle對ID查找的優化,因此它成爲大頁面上的性能問題。 – MattW 2013-03-23 18:09:04

0

我會強烈建議您簡化idname屬性。

以下是從HTML4文檔和可用於不同版本的HTML不同:
http://www.w3.org/TR/html4/types.html#type-id

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

個人而言,我永遠只能使用字母,連字符和下劃線字符。我儘量讓它們簡短和語義化。這不僅使我自己更容易,而且可以使用我的代碼的任何其他開發人員更容易。

+0

這就是HTML 4. HTML5中允許使用方括號。無論如何,這並不能真正回答這個問題。 – JJJ 2013-03-23 18:08:13

+1

它可能不會回答這個問題。但是,如果代碼首先寫得很好,那麼問題就不需要問了。 – diggersworld 2013-03-23 18:10:29

+0

@diggersworld感謝您的建議,我很感激。 – Dreamer 2013-03-23 18:20:18