在javascript dom中,有属性名称的规则吗?

时间:2011-08-03 18:14:18

标签: javascript css dom attributes

用于使用table:rowNum:<name>等属性名称的页面上的元数据,例如

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()

<小时/> 来自chrome控制台:

> 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

1 个答案:

答案 0 :(得分:4)

您似乎可以使用双反斜杠转义特殊字符:

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

我认为这个问题与冒号通常表示伪元素的事实有关。

根据WHATWG spec,除了那些会改变上下文的字符之外的任何字符(例如,等于字符,指定值的开头,或大于字符,这将指定结束标签)。在此基础上,可以在属性名称中使用冒号字符。

更新(根据对问题的回答和更新的评论)

要同时使用querySelectorgetAttribute两个变量,您可以执行此类操作,或者您可以只使用转义字符存储版本,而不存储一个(这肯定是我的首选选项) ):

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