对于页面上的元数据,使用属性名称,例如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
解决方法
看起来你可以用双反斜杠转义特殊字符:
var el2 = element.querySelector("[emp\\:1\\:update]");
我认为这个问题与冒号通常表示伪元素的事实有关.
根据WHATWG spec,除了那些将改变上下文的字符之外的任何字符(例如,指定值的开头的等号字符,或指定标记结尾的大于字符).在此基础上,可以在属性名称中使用冒号字符.
更新(根据对问题的答案和更新的评论)
要将一个变量与querySelector和getAttribute一起使用,您可以执行类似这样的操作,或者您可以只存储带有转义字符的版本,而不存储一个(这肯定是我的首选选项):
var s = "emp\\:1\\:update"; console.log(row.getAttribute(s.replace(/\\/g,"")));