事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分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

最新文章

  1. C# 根据正则表达式来判断输入的是不是数字
  2. Scala 深入浅出实战经典 第75讲:模式匹配下的For循环
  3. js实例代码
  4. startUML常用的组合片段
  5. SQL Server 日志清除
  6. HDU 3492 (直线与所有线段相交) Segment
  7. 【HBase学习】Apache HBase项目简介
  8. h5标签canvas关于getImageData跨域的问题
  9. Leetcode 实施细节 Rotate Image
  10. Angular 2.0 从0到1 (五)
  11. Apache无法启动提示the requested operation has failed
  12. Spring component-scan 的逻辑 、单例模式下多实例问题、事务失效
  13. Win7 安装bundle
  14. 用Ajax遍历三级下拉框
  15. PMP学习经验总结——ITTO第六版教材
  16. Java 中文 乱码问题
  17. bind this指针
  18. 使用 Kafka 在生产环境构建大规模机器学习
  19. c++复习:STL之容器
  20. ansible-playbook剧本

热门文章

  1. linux 查看在线服务进程
  2. C++多线程编程(★入门经典实例★)
  3. 经典的 div + css 鼠标 hover 下拉菜单
  4. 毕向东_Java基础视频教程第21天_IO流(1)
  5. c# 获取程序目录
  6. 2 Docker 镜像基础
  7. day13 多线程建立方法
  8. 【OpenCV】图像增强---灰度变换、直方图均衡化
  9. 【[HAOI2015]树上染色】
  10. [Noip2007]Core树网的核