ajax 加载 页面 执行 js

ajax 加载 页面 执行 js 博客分类: java

事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分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|\r\n)*?<\/script>/ig;  
   var jsContained = html.match(regDetectJs);  
   

  if(jsContained) {  
   var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/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. var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;  
  3. var jsContained = ajaxLoadedData.match(regDetectJs);  
  4.   
  5. // 第二步:如果包含js,则一段一段的取出js再加载执行  
  6. if(jsContained) {  
  7.     // 分段取出js正则  
  8.     var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;  
  9.   
  10.     // 按顺序分段执行js  
  11.     var jsNums = jsContained.length;  
  12.     for (var i=0; i<jsNums; i++) {  
  13.         var jsSection = jsContained[i].match(regGetJS);  
  14.   
  15.         if(jsSection[2]) {  
  16.             if(window.execScript) {  
  17.                 // 给IE的特殊待遇  
  18.                 window.execScript(jsSection[2]);  
  19.             } else {  
  20.                 // 给其他大部分浏览器用的  
  21.                 window.eval(jsSection[2]);  
  22.             }  
  23.         }  
  24.     }  
  25. }  

解说下: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|\r\n)*?<\/script>/ig;
var jsContained = ajaxLoadedData.match(regDetectJs);
// 第二步:如果包含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_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脚本。

 

 

 

 

 

转载于:https://my.oschina.net/xiaominmin/blog/1597822

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值