所以,首先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