执行ajax返回数据中包含的script脚本代码
作者:秋了秋 发表时间:2016年09月23日
ajax虽然很方便,提升了我们的交互体验,但是它也有可恨之处,就是ajax请求得到的数据中如果包含脚本代码,比如说请求得到的是一块html内容,我们把这块html内容插入到网页中的某个地方,但是其中明明存在的脚本却不能得以运行,如果你听不懂我在说什么,说明你还不懂ajax或者用得少没遇到这种现象。通常来讲,页面中包含的脚本形式无非两种:
第一种:
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?d9369436322d94b2213525fa8711e642";
var s = document.getElementById("script");
s.appendChild(hm);
})();
</script>
第二种:
<script src="//netblog.cn/index.js"></script>
但是他们都不执行,这该如何是好?为了解决这个千古难题~我专门写了个函数攻破这个瓶颈!!!使得无论如何怎么ajax,效果都跟刷新页面也一样,所有该有的script执行环境都有了。函数如下:
function executeScript(html){
var reg = /<script[^>]*>([^\x00]*)$/i;
var htmlBlock = html.split("<\/script>");
var blocks,srcBlock,script;
var scriptContent=document.getElementById("script")||document.body;
for (var i in htmlBlock){
if (blocks = htmlBlock[i].match(reg)){
var matchAll=blocks[0];
var srcReg=/src=[\'\"](.*?)[\'\"]/i;
if(srcBlock=matchAll.match(srcReg)){
script=document.createElement("script");
script.src=srcBlock[1];
scriptContent.appendChild(script);
}else{
var code = blocks[1].replace(/<!--/, '');
try{
eval(code)
}
catch (e){
console.log(e);
}
}
}
}
}
使用方法就是在ajax请求成功之后并把相应请求结果插入到页面之后再调用这个函数,参数就是请求得到的数据:executeScript(data);
说一下思路原理:从请求的数据中通过正则匹配查找script标签并把它们都分离出来,然后判断是什么形式的script标签,如果有src的就把src地址通过正则匹配出来,然后创建一个新的script标签插到网页中。否则通过evel直接执行script里面的代码。
4
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/459.html