在将响应插入DOM时,如何防止ajax请求返回的javascript执行?

在将响应插入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返回的JS代码。我希望我有那个问题。我的JS执行,但我也不想要它

使用jQuery 1.4.2,我发出一个GET请求:

$.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, "&lt;$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);