`
m635674608
  • 浏览: 4923895 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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 plaincopy
 
  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脚本。

 

 

 

 

 

分享到:
评论

相关推荐

    Ajax 动态载入html页面后不能执行其中的js快速解决方法

    1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。 2. 使用[removed]输出代码,我等简洁主义者所不愿。 3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,...

    实例详解Android Webview拦截ajax请求

    本篇内容主要给大家讲解了Android Webview拦截ajax请求的详细讲解,需要的朋友一起来学习一下。

    浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机还是有一定差异,今天我们再来探讨一下通过动态脚本技术和Ajax注入的脚本在这些方面的...

    使用ajax加载的页面中包含的javascript的解决方法

    1、【使用iframe】 在需要加载的页面中添加一个iframe,如下 代码如下: &lt;...如:xxx[removed]=XMLHttp取得的数据 这样是不会执行JS,添加eval方法就ok了:如:xxx[removed]=eval&#40;返XMLHttp取得的数据&#41;

    jquery的ajax同步和异步的理解及示例

    这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。 而异步则这个AJAX代码运行中的时候其他代码一样可以...

    AJAX无刷新聊天室技术

    传统的聊天室基于客户端网页的自动刷新技术而实现,它的主要缺点是不断刷新页面造成屏幕的闪动,而经过了Ajax改造后的聊天室,每次只获取最新的发言信息,并将获取结果动态写入页面,不会有以上的缺点 ………………...

    jQuery实现AJAX定时刷新局部页面实例

    局部刷新我们讲述到最多的是ajax 了,当然也可以不使用ajax来刷新页面了,我们可以使用jquery中的append来给指定内容加东西了,当然最实用的还是ajax加载数据了。 例子,定时局部刷新 定时局部刷新用到jQuery里面的...

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    基于Apache Nutch 1.8和Htmlunit组件,实现对于AJAX加载类型页面的完整页面内容抓取解析。 According to the implementation of Apache Nutch 1.8, we can't get dynamic ...

    php - ajax

    它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。...

    Ajaxify-any-website:ajax加载网站内部链接的简单代码

    只需在您通常在网站中执行的位置添加此 javascript 代码并添加一个新的 就在你的里面 (或您称之为主要内容的任何内容)包装器。 确保仅将内容 div 放在要重新加载的内容周围,页眉和/或页脚应该在外面。 例如: ...

    PHP培训教程之AJAX技术.docx

    通过HTTPRequest,一个web页面可以一个请求到web器并且接受web器返回的信息(不用重新加载页面),展示给用户的还通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的请求和接受响应。 7、AJAX请求总共有...

    Ajax-bootstrap-star-rating-codeigniter.zip

    Ajax-bootstrap-star-rating-codeigniter.zip,带编码器点火器的动态自举星级评定,ajax代表异步javascript和xml。它是多种web技术的集合,包括...它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。

    【卷一/共两卷】AJAX实战pdf高清版90M

    8.2.3 优化Ajax应用的执行速度 8.3 JavaScript的内存使用量 8.3.1 避免内存泄漏 8.3.2 Ajax的特殊考虑因素 8.4考虑性能的设计 8.4.1 测量内存使用量 8.4.2 简单示例 8.4.3 结果:如何将内存使用量缩减150倍 8.5 小结...

    ajax-amd:Ajax.js是一个帮助ajax请求的库。 该库使用amd结构

    您只需要使用进行安装并在页面上加载elo7-ajax-amd文件即可。 方法 得到 .get(url, data [,callbacks] [,config]) 描述: 使用get http方法执行ajax请求。 样品: define ( [ 'ajax' ] , function ( ajax )

    AJAX、http传输协议、响应状态码、请求方式

    AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行 ———————————————— 版权声明:...

    jQuery+ajax实现动态执行脚本的方法

    本文实例讲述了jQuery+ajax实现动态执行脚本的方法。分享给大家供大家参考。具体分析如下: 有时候,在页面初次加载时就取得所需的全部JavaScript也是没有必要的。具体需要取得哪个脚本,要视用户的操作而定。虽然...

    Ajax-Ajax-CRUD-example-in-laravel.zip

    Ajax-Ajax-CRUD-example-in-laravel.zip,使用ajax在laravel中执行crud操作的示例。,ajax代表异步javascript和xml。它是多种web技术的集合,包括...它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。

    jquery中的ajax同步和异步详解

    这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。 而异步则这个AJAX代码运行中的时候其他代码一样可以...

    ajax中的async属性值之同步和异步及同步和异步区别

    这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。而异步则这个AJAX代码运行中的时候其他代码一样可以...

Global site tag (gtag.js) - Google Analytics