jquery html()去掉脚本标签

我需要用ajax调用的html结果来replace页面中div的内容。 问题是,在HTML中有一些必要的脚本,它似乎jQuery的HTML()函数剥掉它们,我需要筛选的响应,只得到一个特定的股利。

我想一个解决方法是从ajax响应中提取所有的脚本标记,然后追加他们做的DOM,但我有麻烦这样做。

这是我的代码;

$('a.link-vote').live('click',function(){ var idfeedback = $(this).attr('id').split('-')[1]; var href = $(this).attr('href'); $('.feedback-' + idfeedback + '-loader').show(); $.ajax({ type: "POST", url: href, success: function(response){ var x = $(response).find('#feedback-'+ idfeedback).html(); $('.feedback-' + idfeedback + '-loader').hide(); $('#feedback-'+ idfeedback).html(x); } }); return false; }); 

我发现了这个老话题: HTML中的jQuery脚本标签被jQueryparsing出来,并且不被执行

但这是任何结论。 我尝试了那里build议的解决scheme,但没有一个工作。

编辑:我似乎find了一个基于这个旧主题的解决方法,但它不漂亮;

  var dom = $(response); // var x = $(response).find('#feedback-'+ idfeedback).html(); $('.feedback-' + idfeedback + '-loader').hide(); //$('#feedback-'+ idfeedback).html(x); $('#feedback-'+ idfeedback).html(dom.find('#feedback-'+ idfeedback).html()); dom.filter('script').each(function(){ var obj = $(this); $('#feedback-'+ idfeedback + ' .feedback-comments').append(obj); }); 

必须有一个简单的方法。

编辑:我累了,没有想到。 您可以使用本机innerHTML方法而不是.html()

 $('#feedback-' + idfeedback)[0].innerHTML = x; 

原始答案:

我的直觉是你链接的答案不适合你,因为包含的脚本被调用了src属性而不是脚本内容在<script></script>标签之间。 这可能工作:

 $.ajax({ url: 'example.html', type: 'GET', success: function(data) { var dom = $(data); dom.filter('script').each(function(){ if(this.src) { var script = document.createElement('script'), i, attrName, attrValue, attrs = this.attributes; for(i = 0; i < attrs.length; i++) { attrName = attrs[i].name; attrValue = attrs[i].value; script[attrName] = attrValue; } document.body.appendChild(script); } else { $.globalEval(this.text || this.textContent || this.innerHTML || ''); } }); $('#mydiv').html(dom.find('#something').html()); } }); 

请注意,这没有经过任何testing,可能会吃婴儿。

我有同样的问题,但有更多的问题,我不能很容易地修复。 但我find了一个解决scheme:

这是我的伪源(HTML),我不能以任何方式改变。

 <html> <body> <div id="identifier1"> <script>foo(123)</script> </div> <div id="identifier2"> <script>bar(456)</script> </div> </body> </html> 

我用$.get()来获取这个HTML页面。 现在我已经将代码作为一个string了,现在是时候用jQuery进行search了。 我的目标是,隔离属于DIV identifier2<script> -Tag内的Javascript-Code,但不是identifier1 。 所以我想得到的是一个结果stringbar(456) 。 由于这个原因,jQuery去掉了所有的脚本标签,你不能这样search:

 var dom = $(data); //data is the $.get() - Response as a string var js = dom.filter('div#identifier2 script').html(); 

该解决scheme是一个简单的解决方法。 一开始我们将用<sometag>类的东西replace所有的<script> -Tags:

 var code = data.replace(/(<script)(.*?)(<\/script>)/gi, '<sometag$2</sometag>'); var dom = $(code); var result = dom.find('div#identifier2 sometag').html(); //result = bar(456) 

这是一个简单的黑客,但它的作品!

尝试

 $('#feedback-'+ idfeedback).empty().append(response); 

我没有testing。 不知道如果.html()真的剥离<script>但试试这个。

你能告诉我的结果HTML结构?

更新2010/11/03

您可以使用正则expression式从.html()结果中消除<script>标记。
从你的第一个代码,在这一行之后。

 var x = $(response).find('#feedback-'+ idfeedback).html(); 

你可以做这样的事情。

 x = x.replace(/\n/g, '{n}') .replace(/<script.*?<\/script>/g, '') .replace(/{n}/g, '\n');