• ajax 加载 js


    事件背景

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

      }

    解说下: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) {
    }
    }
    }
    }

  • 相关阅读:
    JQ和Js获取span标签的内容
    JS获取子节点、父节点和兄弟节点的方法实例总结
    JS实现系统时间(自动)
    CSS font-family 属性
    网页中导入特殊字体@font-face属性详解
    ****HTML模板资源汇总
    ***XAMPP:报错 Unable to load dynamic library的解决方法
    2016年宜昌楼市将迎来史上最激烈一战
    北大资源重磅来宜--宜昌未来商业中心将诞生
    HTML5调用传感器的资料汇总
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839309.html
Copyright © 2020-2023  润新知