ajax 动态载入html后不能执行其中的js解决方法
2024-10-21 07:55:12
事件背景
有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。
解决思路
1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。
2. 使用document.write输出代码,我等简洁主义者所不愿。
3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。
4. eval是个解决方法,虽然低效。
5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个<script>标签,把js内容插入即可执行。但使用中发现,firefox可行,但IE还是不从。(师太,您就从了吧~)
解决方案
综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:
// 第一步:匹配加载的页面中是否含有js
var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
var jsContained = ajaxLoadedData.match(regDetectJs); //ajaxLoadedData为ajax获取到的数据 // 第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {
// 分段取出js正则
var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im; // 按顺序分段执行js
var jsNums = jsContained.length;
for (var i=0; i<jsNums; i++) {
var jsSection = jsContained[i].match(regGetJS); if(jsSection[2]) {
if(window.execScript) {
// 给IE的特殊待遇
window.execScript(jsSection[2]);
} else {
// 给其他大部分浏览器用的
window.eval(jsSection[2]);
}
}
}
}
解说下:window.execScript就IE认,其他浏览器需要用eval啦。
至此,算比较完美的解决。
转自:http://www.impng.com/web-dev/execscript-loaded-by-ajax.html
最新文章
- C# 根据正则表达式来判断输入的是不是数字
- Scala 深入浅出实战经典 第75讲:模式匹配下的For循环
- js实例代码
- startUML常用的组合片段
- SQL Server 日志清除
- HDU 3492 (直线与所有线段相交) Segment
- 【HBase学习】Apache HBase项目简介
- h5标签canvas关于getImageData跨域的问题
- Leetcode 实施细节 Rotate Image
- Angular 2.0 从0到1 (五)
- Apache无法启动提示the requested operation has failed
- Spring component-scan 的逻辑 、单例模式下多实例问题、事务失效
- Win7 安装bundle
- 用Ajax遍历三级下拉框
- PMP学习经验总结——ITTO第六版教材
- Java 中文 乱码问题
- bind this指针
- 使用 Kafka 在生产环境构建大规模机器学习
- c++复习:STL之容器
- ansible-playbook剧本