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

原文地址:https://www.cnblogs.com/PYiP/p/9203091.html

时间: 2024-08-10 15:09:50

ajax 动态载入html后不能执行其中的js解决方法的相关文章

jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

转自:http://www.cnblogs.com/sunjie9606/archive/2012/09/13/2683636.html 现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout" 等 处理方法: 在html片段加载完毕后使用 Js代码 $.parser.parse(context) 即可重新渲染. 实现原理: 首先附上jquery.parser.js的源码 Js代码 (function($){ $.parser

php 表单提交错误后返回数据消失问题的解决方法

本文章向码农们介绍php 表单提交错误后返回数据消失问题的解决方法,感兴趣的码农可以参考一下. 表单提交错误后返回数据消失怎么办呐,今天就来分析解决一下这个问题. 状况概述: 做填写表单信息提交的时候会碰到一个问题就是当用户填写并提交表单后,程序判断不符合要求并返回,返回之后之前填写的表单信息会被清空了的情况.如果填写的信息量少还无所谓,如果填写的信息量比较多,这会直接打击到填写信息的人的良好心情.因此解决表单提交错误返回后填写的内容消失的问题是一个提高用户体验度的迫在眉睫的问题. 对于这种问题

项目部署到tomcat6.0启动成功后访问页面报500错误解决方法

如题:项目部署到tomcat6.0启动成功后访问页面报500错误解决方法,很奇葩,启动的时候没有任何问题,但输入访问地址后报500,去年国庆放假前夕,为这个问题伤神了半天最后解决了,今天又碰到了,乍一看摸不着头,后面仔细回想了下,迅速解决了问题. 原因:项目里面的jar和tomcat里面lib里面的jar重复了. 解决方法: 1.要么更换tomcat7或之后的版本,之后的版本就不会出现这个问题. 2.去部署之后的tomcat的webapps\项目名\WEB-INF\lib 里面删掉jsp-api

android-继承BaseAdapter--自定义适配器,getView执行多次的解决方法

定义的getView执行多次的ListView布局: [html] view plaincopy <ListView android:id="@+id/lv_messages" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layo

vs自动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法

近日,在项目中需要引用java发布的WebService,添加服务引用后,调用一切正常. 配置如下: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="SecurityServiceImplServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize=&qu

复制工程或修改工程名字后找不到第三方库解决方法

问题: couldn't found -lwexin 等与第三方库有关的关键词报错,如上图. 解决方法:在工程文件中删掉第三方库的引用,然后再重新添加进来.command+B,OK. 复制工程或修改工程名字后找不到第三方库解决方法

&lt;转&gt;jquerymobile动态添加元素之后有些不能被正确渲染的解决方法

jquerymobile动态添加元素之后有些不能被正确渲染的解决方法:listview: 添加 jq(".detail").listview("refresh");div或其他: 添加.trigger( "create" );jq(".detail:eq("+ix+1+")").append("<li>"+data.linete[i].S_Station+data.linet

CentOS网络配置后无法访问外网的解决方法

CentOS网络配置后无法访问外网的解决方法 关于CentOS网络的具体配置项,可以参考Mitchell博客之前的那篇文章. 现象: ping内网正常ping外网IP,域名均无法正常,返回错误:connect: Network is unreachable 后面在无意中看到Linux网络配置有添加网关的命令: 复制代码 代码如下: route add default gw 192.168.128.2 dev eth0 按上面操作,添加了默认的网关之后.再次访问外网一切正常. 有这个现象来看,应该

Jquery chosen动态设置值 select Ajax动态载入数据 设置chosen和获取他们选中的值

? 在做一个编辑对话框时,要对里面带有select option的操作.主要是想动态载入option和对option的选中.可是由于项目中使用了jquery里的chosen()方法.怎么也无法实现效果.原码例如以下: ? ? Java代码 ? <select?id="viewOLanguage"?data-rel="chosen">?? ????<option?value="zh">中文简体(中文简体?Chinese)&l