zoukankan      html  css  js  c++  java
  • ajax 动态载入html后不能执行其中的js解决方法

    事件背景

    有一个公用页面需要在多个页面调用,其中涉及到部分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); //ajaxLoadedData为ajax获取到的数据
    
    // 第二步:如果包含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(jsSection[2]);
                }
            }
        }
    }

    解说下:window.execScript就IE认,其他浏览器需要用eval啦。

    至此,算比较完美的解决。

    转自:http://www.impng.com/web-dev/execscript-loaded-by-ajax.html

  • 相关阅读:
    js获取当前页面url网址等信息
    jQuery 复选框全选/取消全选/反选
    js获取日期实例之昨天今天和明天、后天
    mysql不重启修改参数变量
    php 读取功能分割大文件实例详解
    php批量删除数据库下指定前缀的表
    PHP遍历目录返回统计目录大小实例
    PHP二维数组如何根据某个字段排序
    PHP 如何获取二维数组中某个key的集合(高性能查找)
    jQuery 隐藏与显示 input 默认值
  • 原文地址:https://www.cnblogs.com/PYiP/p/9203091.html
Copyright © 2011-2022 走看看