您需要在元素本身上调用removeChild:
function escapeHTML(str) {
var div = document.createElement('div');
var text = document.createTextNode(str);
div.appendChild(text);
var escapedHTML = div.innerHTML;
div.removeChild(text);
return escapedHTML;
}
要记住的一点是,此解决方案在某些浏览器中存在问题(例如处理换行符 = "\n")。在 Prototype.js 中,我们explicitly check for some of these quirks 并适当地调整逻辑。
当然,您应该使用特征检测,而不是浏览器嗅探;)
您也不需要在每次调用函数时都创建新元素。只需将其存放在封闭装置中。例如:
var escapeHTML = (function(){
var div = document.createElement('div');
var text = document.createTextNode('');
div.appendChild(text);
return function(str) {
text.data = str;
return div.innerHTML;
};
})();
如果您采用这种方法并永久保留元素,您还可以在页面卸载时考虑清理它(即nulling),以防止可能的泄漏。
不幸的是,仅注册卸载事件处理程序会阻止快速导航(又名页面缓存)在许多浏览器中。大多数 JS 库已经观察到该事件以进行清理,因此如果您正在使用一个(例如 Prototype.js、jQuery、YUI),您不必担心它 - 无论如何页面缓存都会被禁用。
否则,您可能需要重新考虑您的选择,要么总是在运行时创建元素,要么完全采用不同的解决方案(例如基于String.prototype.replace 的解决方案):
function escapeHTML(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
}
哦,最后,你不需要放置“;”在函数声明之后; 函数表达式建议以分号结尾:)