2011-08-03 109 views
7

使用屬性的名稱,如table:rowNum:<name>的頁面上,例如元數據,在javascript dom中,是否有屬性名稱的規則?今天

 
var row = document.createElement('tr'); 
row.setAttribute('tup','emp:1'); 
row.setAttribute('emp:1:pkid','123'); 

一直在使用冒號分隔的名稱(例如,name='emp:1:emp_id')多年來以良好的成功,但得到了與冒號分隔屬性名稱位

特別是:

 
var el2 = row.parentNode.querySelector("[emp:1:pkid]"); 
=> `Error: SYNTAX_ERR: DOM Exception 12` 

就像是特殊字符 ':' 在DOM非法屬性的名稱?可以特殊字符逃脫與querySelector()


從鉻控制檯:

 
> row.parentNode.querySelector('[emp:1:pkid]'); 
Error: SYNTAX_ERR: DOM Exception 12 

按照詹姆斯(如下圖):

 
> row.parentNode.querySelector('[emp\\:1\\:pkid]'); 
123 

但問題 - 不getAttribute工作 - PIA

 
> row.getAttribute('emp:1:pkid'); 
123 
> row.getAttribute('emp\\:1\\:pkid'); 
null 
+0

有趣,我還不確定(查找它)。與此同時,對於未來的項目,請考慮使用jQuery的'data()'。它可以讓你設置任意的數據並將它與你的dom元素相關聯(都來自服務器,所以你的js只能使用它和客戶端。)http://api.jquery.com/jQuery.data/ – Milimetric

+0

DOM屬性是類型的DOMString,它是一個UTF-16編碼的序列,據我所知,你使用的字符應該沒問題,但我並不是100%確定的,儘管如此評論而不是答案 –

+0

@cc young - ' querySelector('[emp \\:1]')'將返回null,因爲它與元素不匹配(基於你最初發布的例子)。你的意思是'[emp \\:1 \\:update ]'? –

回答

4

似乎你可以用雙重字符逃避特殊字符反斜槓:

var el2 = element.querySelector("[emp\\:1\\:update]"); 

我認爲問題是與冒號通常表示僞元素的事實有關。

根據WHATWG spec,除了那些會改變上下文的字符(例如,等於字符,因爲它指定了值的開始或者大於字符,其將指定標籤的結尾)之外的任何字符。在此基礎上,可以在屬性名稱中使用冒號字符。

更新(基於問題的答案評論和更新)

要使用一個變量既querySelectorgetAttribute,你可以做這樣的事情,或者你可以只保存版本的轉義字符,和一個沒有(這絕對是我的首選選項):

var s = "emp\\:1\\:update"; 
console.log(row.getAttribute(s.replace(/\\/g, ""))); 
+0

很好的洞察力,但問題:使用querySelector()可以正常工作,但_fails_用'getAttribute()' - 看問題區域,例如 –

+0

擺脫方括號'getAttribute' tak es傳遞給它的整個字符串作爲屬性的名稱。 –

+0

方括號:示例文本上的剪切和粘貼問題。問題依舊。 –

相關問題