2011-08-03 40 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

方括号:示例文本上的剪切和粘贴问题。问题依旧。 –

相关问题