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');