有谁知道一种简单的方法来从jQuery的字符串中转义HTML ?我需要能够传递任意字符串并正确地对其进行转义以显示在HTML页面中(防止JavaScript / HTML注入攻击)。我敢肯定可以扩展jQuery来做到这一点,但是目前我对框架还不了解。
使用jQuery转义HTML字符串
这是一个很好的例子。
function escapeHtml(str) {
if (typeof(str) == "string"){
try{
var newStr = "";
var nextCode = 0;
for (var i = 0;i < str.length;i++){
nextCode = str.charCodeAt(i);
if (nextCode > 0 && nextCode < 128){
newStr += "&#"+nextCode+";";
}
else{
newStr += "?";
}
}
return newStr;
}
catch(err){
}
}
else{
return str;
}
}
经过最后的测试后,我可以推荐最快和完全跨浏览器兼容的本机JavaScript(DOM)解决方案:
function HTMLescape(html){
return document.createElement('div')
.appendChild(document.createTextNode(html))
.parentNode
.innerHTML
}
如果您重复多次,则可以使用一次准备好的变量进行操作:
//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);
//main work for each case
function HTMLescape(html){
DOMtext.nodeValue = html;
return DOMnative.innerHTML
}
我意识到我参加这个聚会有多晚,但是我有一个非常简单的解决方案,不需要jQuery。
escaped = new Option(unescaped).innerHTML;
编辑:这不会转义引号。唯一需要转义引号的情况是将内容内联粘贴到HTML字符串中的属性上。对于我来说,很难想象这样做会是一个好的设计。
编辑2:如果性能至关重要,则性能最高的解决方案(大约50%)仍然是一系列正则表达式的替代品。现代浏览器会检测到正则表达式不包含任何运算符,仅包含一个字符串,并将它们全部折叠为一个操作。
如果您转义使用HTML,那么我认为只有三点是真正必要的:
html.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
根据你的使用情况,您可能还需要做这样的事情"
来"
。如果列表足够大,我将使用一个数组:
var escaped = html;
var findReplace = [[/&/g, "&"], [/</g, "<"], [/>/g, ">"], [/"/g, """]]
for(var item in findReplace)
escaped = escaped.replace(findReplace[item][0], findReplace[item][1]);
encodeURIComponent()
只会针对网址而不是HTML进行转义。
您可以使用vanilla js轻松实现。
只需在文档中添加文本节点即可。浏览器会将其转义。