所以,首先FO所有:
var code = document.getElementsByTagName('code').innerHTML;
document.getElementsByTagName返回列表元素不只是一个。所以,如果你的目的是逃避全部code
标签你在页面中,你需要迭代它们。第二,我相信你可以避免只使用textContent
(如果支持)或innerText
的正则表达式。
var codes = document.getElementsByTagName("code");
for (var i = 0, code; code = codes[i++];) {
if ("textContent" in code)
code.textContent = code.innerHTML;
else if ("innerText" in code)
code.innerText = code.innerHTML;
}
,或者创建一个新的文本节点:
var codes = document.getElementsByTagName("code");
for (var i = 0, code, html; code = codes[i++];) {
html = code.innerHTML;
code.innerHTML = "";
code.appendChild(document.createTextNode(html));
}
这应该逃避所有的HTML实体。如果你还是想用正则表达式,也许作为后备,你可以有这样的功能:
var escapeEntities = (function(){
var entities = {"<" : "lt", ">" : "gt", "&" : "amp" };
var re = new RegExp("[" + Object.keys(entities).join("") + "]", "g");
function replaceEntities(match) {
return match in entities ? "&" + entities[match] + ";" : match;
}
return function(value) {
return value.replace(re, replaceEntities);
}
})()
然后在你的代码:
code.innerHTML = escapeEntities(code.innerHTML);
请注意,如果不支持Object.keys你可以轻松使用垫片(如链接所示);或者干脆手动替换实体的列表中,您支持:
var entities = {"<" : "lt", ">" : "gt", "&" : "amp" };
var re = /[<>&]/g;
在你需要记住两个entities
和re
变量添加要在未来支持新的实体,这种情况下; Object.keys
只是帮助您进行维护。
我是否错过了某些东西,或者是正则表达式,就像在大拇指上使用大锤一样? – 2012-03-23 18:08:33
您可能还想编写'code = code.replace(/&/ g,'&')' - 甚至在执行'<' and '>'步骤之前。 – ruakh 2012-03-23 18:11:43
@BradChristie - 你还会怎么做?字符串替换只能找到第一个。你真的认为'code.split('>')。join('>')'更好吗? – 2012-03-23 18:14:26