我正在使用javascript中的新插件,使用Ajax请求加载HTML页面,从页面中提取所有脚本,然后在加载所有内容后执行它。要做到这一点,我正在尝试这样的事情:
var scripts = '',
domResponse = $('<div/>').append(HTMLresponse
.replace(/<\s*script\s*([^>]*)>((.|\n)*)<\s*\/\s*script>/i, function($0,$1,$2){
scripts += $2;
return '';
}));
// Then I load the content and I execute scripts
当我尝试使用包含单个脚本标记的页面时,它可以正常工作,但如果我尝试使用如下页面:
<script>
// Some javascript
</script>
<!-- SOME HTML -->
<script>
// Another script
</script>
domResponse为空,脚本包含第一个&lt; script&gt;之间的文本。和最后一个&lt; / script&gt;。
是否有任何解决方案可以使其正常工作?
答案 0 :(得分:3)
如果我明白你要做什么,这会有用吗?
var scriptElements = document.getElementsByTagName("script");
var scripts = "";
for(var i = 0; len = scriptElements.length; i < len; i++) {
scripts += scriptElements[i].innerHTML;
scriptElements[i].innerHTML = "";
}
// load content and execute scripts
答案 1 :(得分:0)
与其他人一样,我建议不要使用正则表达式来处理任何与HTML相关的内容。
然而,忽略这一点,我仍然可以回答你的问题。你的问题是你正在使用一个贪婪的量词,即(.|\n)*
,它尽可能地“吃掉” ,只要它以</script>
结尾。你想要的是一个非贪婪量词,像这样:
<\s*script\s*([^>]*)>((.|\n)*?)<\s*\/\s*script>
见这里:http://rubular.com/r/U2vvOW6XfZ。
请注意,如果脚本标记中的任何属性包含>
,则正则表达式将会中断;如果脚本出于某种原因在其中包含</script>
(可能在评论中);如果页面通常已注释掉一个脚本;这就是为什么使用解析器要好得多。