我编写了一些代码,使用jQuery来清除字符串中的丑陋HTML(在该SO问题中可以看到早期原型)。它工作得很好,但我遇到了一个问题:
当使用.append()将HTML包装在div中时,代码中的所有脚本元素都会被评估和运行(参见此SO答案以了解为什么会发生这种情况)。我不想这样做,我只是想让它们被删除,但只要它们不被运行,我就可以自己解决后面的处理。
我正在使用以下代码:
var wrapper = $('<div/>').append($(html));
我尝试以另外一种方式来实现:
var wrapper = $('<div>' + html + '</div>');
但这只会在IE中引发“拒绝访问”错误,而append()函数可以修复该问题(请参见我上面提到的答案)。
我认为我可能能够重写我的代码,使其不需要包装html,但我不确定,我想知道是否有可能附加html而不运行其中的脚本。
我的问题:
如何包装未知的html片段,而不运行其中的脚本,最好是将其完全删除?
我是否应该抛弃jQuery,改用普通JavaScript和DOM操作来实现?这样会有帮助吗?
我不打算做什么:
我不打算在客户端实现某种安全层。 我非常清楚这是毫无意义的。
更新:James的建议
James建议我应该过滤掉脚本元素,但是看看这两个示例(首先是原始文件,然后是James的建议):
jQuery("<p/>").append("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there")
保留文本节点但输出"gnu!"
jQuery("<p/>").append(jQuery("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there").not('script'))`
不写 gnu!而且还会丢失文本节点。
更新2:
James 更新了他的答案,我已经接受了。不过请看一下我对他的答案最新的评论。
not()
只有在脚本未包含在另一个元素中时才起作用。 - bpierrejQuery(wrapper).find('script').remove()
。它在Chrome中有效,现在我会尝试在IE中使用(皱眉)。 - Peter Jaric