Итак, сначала для всех:
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
просто поможет вам в обслуживании.