使用jQuery逃离HTML

我想出了一个黑客使用jQuery转义HTML,我想知道是否有人看到它的问题。

$('<i></i>').text(TEXT_TO_ESCAPE).html(); 

<i>标签只是一个虚拟的,因为jQuery需要一个容器来设置文本。

有没有更简单的方法来做到这一点? 请注意,我需要存储在variables中的文本,而不是显示(否则我可以只是调用elem.text(TEXT_TO_ESCAPE); )。

谢谢!

这是一个非常标准的做法,我的版本使用了一个<div>

 return $('<div/>').text(t).html(); 

尽pipeMike Samuel指出,这在技术上不是100%安全的,但在实践中可能是相当安全的。

目前的Prototype.js是这样做的:

 function escapeHTML() { return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); } 

但它曾经使用“把文本放在div中并提取HTML”的伎俩。

在下划线中也有_.escape ,就是这样的:

 // List of HTML entities for escaping. var htmlEscapes = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#x27;', '/': '&#x2F;' }; // Regex containing the keys listed immediately above. var htmlEscaper = /[&<>"'\/]/g; // Escape a string for HTML interpolation. _.escape = function(string) { return ('' + string).replace(htmlEscaper, function(match) { return htmlEscapes[match]; }); }; 

这几乎和Prototype一样。 我最近做的大部分JavaScript都有_.escape所以我倾向于使用_.escape这些日子。

不能保证html()将被完全转义,所以在连接后结果可能是不安全的。

html()基于innerHTML ,并且浏览器可以在不违反许多期望的情况下实现innerHTML使$("<i></i>").text("1 <").html()"1 <" ,那$("<i></i>").text("b>").html()"b>"

然后,如果连接这两个单独的安全结果,则会得到"1 <b>" ,这显然不是两个纯文本片断连接的HTML版本。

因此,从最初的原则中扣除这个方法并不安全,并且没有广泛遵循innerHTML规范(虽然HTML5确实解决了这个问题)。

最好的方法来检查它是否做你想要的是testing像这样的angular落案件。

这应该工作。 这基本上是Prototype.js库如何做,或者至less它是如何做到的。 我通常做三个电话“.replace()”,但这大多只是一个习惯。