事件背景
有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。
解决思路
1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。
2. 使用document.write输出代码,我等简洁主义者所不愿。
3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。
4. eval是个解决方法,虽然低效。
5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个
解决方案
综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:
//第一步:匹配加载的页面中是否含有js
var regDetectJs = /
|
)*?/ig;var jsContained =ajaxLoadedData.match(regDetectJs);//第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {//分段取出js正则
var regGetJS = /
|
)*)?/im;//按顺序分段执行js
var jsNums =jsContained.length;for (var i=0; i
window.execScript(jsSection[2]);
}else{//给其他大部分浏览器用的
window.eval(jsSection[2]);
}
}
}
}
解说下:window.execScript就IE认,其他浏览器需要用eval啦。
至此,算比较完美的解决。
转自:http://www.impng.com/web-dev/execscript-loaded-by-ajax.html
当一个公用页面通过Ajax加载后,其内部的js无法执行。文章提出了多种解决方案,包括使用iframe、document.write、eval等,但存在一些弊端。最终,作者提供了一个实用方法,通过正则匹配加载的页面中的js并分段执行,既避免了代码冗余,也解决了兼容性问题。主要代码涉及window.execScript和window.eval在不同浏览器中的应用。
1296

被折叠的 条评论
为什么被折叠?



