Pet*_*ric 13 javascript jquery dom
我编写了一些带有一串html的代码,并使用jQuery清除掉任何丑陋的HTML(请参阅此SO问题中的早期原型).它工作得很好,但我偶然发现了一个问题:
当使用.append()将html包装在div中时,代码中的所有脚本元素都会被评估并运行(请参阅此SO答案以解释为什么会发生这种情况).我不想要这个,我真的只是希望它们被删除,但我可以在以后自己处理它,只要它们没有运行.
我正在使用此代码:
var wrapper = $('<div/>').append($(html));
Run Code Online (Sandbox Code Playgroud)
我尝试这样做:
var wrapper = $('<div>' + html + '</div>');
Run Code Online (Sandbox Code Playgroud)
但是这只会在IE中引入append()函数修复的"拒绝访问"错误(请参阅上面引用的答案).
我想我可能能够重写我的代码,不需要围绕html包装,但我不确定,我想知道是否有可能在不运行脚本的情况下附加html,无论如何.
如何在不运行脚本的情况下包装一段未知的html,最好完全删除它们?
我是否应该将jQuery抛出窗口并使用纯JavaScript和DOM操作来执行此操作?那会有帮助吗?
我不是试图在客户端放置某种安全层.我非常清楚这是毫无意义的.
詹姆斯建议我过滤掉脚本元素,但看看这两个例子(原始的第一个和詹姆斯的建议):
jQuery("<p/>").append("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there")
Run Code Online (Sandbox Code Playgroud)
保留文本节点但写入gnu!
jQuery("<p/>").append(jQuery("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there").not('script'))`
Run Code Online (Sandbox Code Playgroud)
不写gnu!,但也丢失了文本节点.
詹姆斯已经更新了他的答案,我接受了.不过,请参阅我对他的回答的最新评论.
Jam*_* An 10
如何首先删除脚本?
var wrapper = $('<div/>').append($(html).not('script'));
Run Code Online (Sandbox Code Playgroud)
假设html中的脚本元素没有嵌套在其他元素中:
var wrapper = document.createElement('div');
wrapper.innerHTML = html;
$(wrapper).children().remove('script');
Run Code Online (Sandbox Code Playgroud)
var wrapper = document.createElement('div');
wrapper.innerHTML = html;
$(wrapper).find('script').remove();
Run Code Online (Sandbox Code Playgroud)
这适用于html只是文本和html在任何元素之外的文本的情况.
| 归档时间: |
|
| 查看次数: |
9980 次 |
| 最近记录: |