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



    另外:


    //运行ajax返回js脚本
    function evalGlobal(strScript){

    var a = document .createElement_x ("script" );
    a.type=
    "text/javascript" ;
    a.text= strScript
    ;
    document .getElementsByTagName_r("head" )[0 ].a (a)
    ;
    }


    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('/\<\!\-\-/', '');
    code =
    code.replace('/\-\-\>/', '');
    try
    {
    evalGlobal(code);
    //eval_r(code)
    //执行脚本


    } catch (e)
    {
    }
    }
    }
    }


    在ajax回调函数中这样处理:


    function loadCallBack() {
    if (xmlHttp.readyState == 4 &&
    xmlHttp.status == 200) {
    hideLoading();
    var
    response =
    xmlHttp.responseText;
    document.getElementByIdx_x("Container").innerHTML
    = response;
    executeScript(response);
    } else
    {
    showLoading();
    }



    }

  • 相关阅读:
    使用npm安装一些包失败了的看过来(npm国内镜像介绍)
    利用JMX统计远程JAVA进程的CPU和Memory
    Spring Boot学习笔记
    django数据库时间存储格式问题
    解决 Ubuntu 无法调节屏幕亮度的问题(转)
    django models auto_now和auto_now_add的区别
    django redis操作
    接口测试的工具
    django中migration文件是干啥的
    mysql简单操作(实时更新)
  • 原文地址:https://www.cnblogs.com/cjunj/p/2157421.html
Copyright © 2011-2022 走看看