zoukankan      html  css  js  c++  java
  • 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) {
    }
    }
    }
    }

  • 相关阅读:
    ADB命令大全
    Backup your Android without root or custom recovery -- adb backup
    Content portal for Pocketables Tasker articles
    Is there a way to detect if call is in progress? Phone Event
    Tasker to proximity screen off
    Tasker to detect application running in background
    Tasker to create toggle widget for ES ftp service -- Send Intent
    Tasker to proximity screen on
    Tasker to answer incoming call by pressing power button
    Tasker to stop Poweramp control for the headset while there is an incoming SMS
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839309.html
Copyright © 2011-2022 走看看