【发布时间】:2015-09-29 15:52:52
【问题描述】:
我正在尝试动态创建一个具有data-* 属性的 HTMLElements 列表,这些属性对应于不同的 HTML 实体,然后由 CSS 拾取并用作伪元素内容,如下所示:
li:after {
content: attr(data-code);
}
问题在于 attr() 正确呈现实际实体,而不是文字代码是 prefix said code with &#x - 你典型的 \ 不起作用。
因此,所需的输出 HTML 类似于:<li data-code="&#xENTITY"></li>。当直接添加到 HTML 时,这完全符合我的 CSS 规则的预期。转义的实体放置在页面上的 :after 伪元素中,并呈现为实体图标。
这就是事情变得奇怪的地方......
如前所述,我正在尝试通过 JavaScript(遍历列表)动态创建和注入这些 lis,而这正是问题发生的地方。
var entities = [{code: '😂'}, ...];
for (var i = 0; i < entitites.length; i++) {
var entity = entitites[i],
listItem = document.createElement('li');
listItem.setAttribute('data-code', entity.code);
list.appendChild(listItem);
}
li 已正确添加到具有正确格式实体集的 DOM,因此它被我的 CSS 规则拾取。但是,不是呈现实体图标,而是显示代码!
请注意,在上图中,呈现的第一个项目是页面上显式显示的 HTML。第二项通过 JS 注入(使用完全相同的代码),然后由 CSS 给定一个 :after 元素。 Chrome 的网络检查器甚至会以不同的方式呈现它!
更奇怪的是,我可以通过 WebInspector 编辑 HTML 并手动注入转义的 data-* 属性 - Chrome STILL 呈现正确的图标!
我在这里不知所措,所以任何指导将不胜感激!
【问题讨论】:
标签: javascript html css fonts escaping