加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax 加载 页面 执行 js

发布时间:2020-12-16 02:08:47 所属栏目:百科 来源:网络整理
导读:事件背景 有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。 解决思路 1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。 2. 使用document.write输出代码,我等简洁主义者所

事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。

解决思路

1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。

2. 使用document.write输出代码,我等简洁主义者所不愿。

3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。

4. eval是个解决方法,虽然低效。

5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个<script>标签,把js内容插入即可执行。但使用中发现,firefox可行,但IE还是不从。(师太,您就从了吧~)

解决方案 (一)

综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:

function executeScript(html) {alert(13);
var regDetectJs = /<script(.|n)*?>(.|n|rn)*?</script>/ig;
var jsContained = html.match(regDetectJs);

if(jsContained) {
var regGetJS = /<script(.|n)*?>((.|n|rn)*)?</script>/im;

var jsNums = jsContained.length;
for (var i=0; i<jsNums; i++) {
var jsSection = jsContained[i].match(regGetJS);

if(jsSection[2]) {
if(window.execScript) { alert(1);
// 给IE的特殊待遇
window.execScript(jsSection[2]);
} else {
// 给其他大部分浏览器用的
window.eval(jsSection[2]); alert(2);
}
}
}
}

}

[js] view plain copy
  1. //第一步:匹配加载的页面中是否含有js
  2. varregDetectJs=/<script(.|n)*?>(.|n|rn)*?</script>/ig;
  3. varjsContained=ajaxLoadedData.match(regDetectJs);
  4. //第二步:如果包含js,则一段一段的取出js再加载执行
  5. if(jsContained){
  6. //分段取出js正则
  7. varregGetJS=/<script(.|n)*?>((.|n|rn)*)?</script>/im;
  8. //按顺序分段执行js
  9. varjsNums=jsContained.length;
  10. for(vari=0;i<jsNums;i++){
  11. varjsSection=jsContained[i].match(regGetJS);
  12. if(jsSection[2]){
  13. if(window.execScript){
  14. //给IE的特殊待遇
  15. window.execScript(jsSection[2]);
  16. }else{
  17. //给其他大部分浏览器用的
  18. window.eval(jsSection[2]);
  19. }
  20. }
  21. }
  22. }

解说下:window.execScript就IE认,其他浏览器需要用eval啦。

至此,算比较完美的解决。

[转自:http://www.impng.com/web-dev/execscript-loaded-by-ajax.html]

解决方案 (二)

执行ajax加载页面中的js总结

2010-12-01 16:40:15| 分类:JavaScript| 标签:ajax执行js|字号订阅

看了《执行ajax加载的页面中包含的javascript》一文,最近刚好被这个问题纠结过,献给痛不欲生的童鞋们…


事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分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|rn)*?</script>/ig;
var jsContained = ajaxLoadedData.match(regDetectJs);
 
// 第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {
 // 分段取出js正则
 var regGetJS = /<script(.|n)*?>((.|n|rn)*)?</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_r(jsSection[2]);
   }
  }
 }
}
 

解说下:window.execScript就IE认,其他浏览器需要用eval啦。

至此,算比较完美的解决。

function executeScript(html) {
var reg = /<script[^>]*>([^x00]+)$/i;
//对整段HTML片段按</script>拆分
var htmlBlock = html.split("</script>");
for ( var i in htmlBlock) {
var blocks;//匹配正则表达式的内容数组,blocks[1]就是真正的一段脚本内容,因为前面reg定义我们用了括号进行了捕获分组
if (blocks = htmlBlock[i].match(reg)) {
//清除可能存在的注释标记,对于注释结尾-->可以忽略处理,eval一样能正常工作
var code = blocks[1].replace(/<!--/,'');
try {
//eval_r(code) //执行脚本
if (!!(window.attachEvent && !window.opera)) {
//ie
execScript(code);
} else {
//not ie
window.eval_r(code);
}

} catch (e) {
}
}
}

网上查询了一些资料,感觉不怎么实用,有兼容浏览器的等问题。

最后还是将相关的htm代码抓取到当前页面,填充,相当于执行js脚本。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读