在将响应插入DOM时,如何防止ajax请求返回的javascript执行?
所以,我看到很多人想知道如何执行通过ajax返回的JS代码。我希望我有那个问题。我的JS执行,但我也不想要它 使用jQuery 1.4.2,我发出一个GET请求:在将响应插入DOM时,如何防止ajax请求返回的javascript执行?,javascript,jquery,Javascript,Jquery,所以,我看到很多人想知道如何执行通过ajax返回的JS代码。我希望我有那个问题。我的JS执行,但我也不想要它 使用jQuery 1.4.2,我发出一个GET请求: $.ajax({ url:'/myurl/', type:'GET', success:function(response){ $('body').html(response); } }); 响应类似于: <p>Some content</p> <script>alert
$.ajax({
url:'/myurl/',
type:'GET',
success:function(response){
$('body').html(response);
}
});
响应类似于:
<p>Some content</p>
<script>alert("hi!");</script>
某些内容
警惕(“嗨!”);
每当调用成功回调并将响应注入DOM时,就会触发警报代码!我不想那样。我能做些什么来防止这种情况发生?如果您不能修改响应,请尝试“替换”
标记:
"<script>alert('hi');</script>".replace(/<(\/?script)/gi, "<$1");
“alert('hi');”。替换(/视情况而定。你需要JavaScript,还是干脆把它扔掉?如果你根本不需要它,你可以这样做
response = response.replace(/<script.*?<\/script>/gi, "");
通过去掉尾随的paren以及它们包含的任何内容,可以阻止函数调用的发生。显然,正则表达式中需要的内容将取决于导致问题的实际代码。$('body').html(response.replace(/(]*/g,$1 src=“emptyfile.js”);
$('body').html(response.replace(/(<script)[^\>]*/g,'$1 src="emptyfile.js"'));
其中emptyfile.js存在但没有内容。是否尝试返回函数()片段,如
函数Hello(){
警报(“你好”);
}
这样,您的JS不会立即执行,但可以在需要时稍后调用。但是,这又取决于您实际想要执行的操作。您遇到的问题是,jQuery从html中删除脚本标记并创建文档片段 详述
var e = $("<div>Hello</div><script>alert('hi')</script>")
e.html(); // will not display script tags as script tags are now in a document fragment
$("body").append(e); // will execute the script tags in the fragment
有关片段创建例程,请参见。您将在
元素中插入
元素,这里有比执行脚本更重要的事情:)@zod-要是这么简单就好了。:P;@Nick Craver-嗯,是的。那是示例代码。编辑后的代码更像我得到的响应。我试图避免使用正则表达式解决方案。我不知道谁将创建响应内容,如果有什么疯狂的事,我想确保该解决方案不会出错。不过谢谢你的建议!@Kappers:听起来很复杂。我想你需要一些xml解析器
。我不确定js中是否有。我想你需要向某个删除潜在危险标记/属性的服务发出第二个请求。我当时的印象是,当你插入via.html()时,jQuery做了一些事情从集合中删除脚本;我找到了一篇2009年的文章,我的一个朋友最近遇到了一个问题,他在回复中没有看到脚本。我简单地查看了jQuery源代码,但找不到任何关于strippage的证据。我还不确定我要做什么:)是的,javascript无法消失。不幸的是,我无法确切地知道在回应中会产生什么。它可能是任何东西。需求声明它可以包含脚本,并且需要在页面上注入完整的响应,包括任何脚本标记。正如我向@BrunoLM提到的,我对使用regex进行此操作持谨慎态度,因为我不知道输出结果是什么:(在没有变得非常复杂的情况下,我只看到3个选项:(1)不要弄乱JS,并明确这是在服务器端引入JS的人的责任;(2)完全删除JS,就像在我的第一个正则表达式中一样;(3)选择一些非常具体的调用进行终止,就像在我的第二个正则表达式中一样,其余的就不用管了。其他任何调用都有可能破坏他们想要的东西。
var e = $("<div>Hello</div><script>alert('hi')</script>")
e.html(); // will not display script tags as script tags are now in a document fragment
$("body").append(e); // will execute the script tags in the fragment
var e = $("<div>Hello</div><script>alert('hi')</script>")
e.filter("script").each(function(){this.text='';});
$("body").append(e);