• JS 动态加载脚本的4种方法【转】


    https://www.jb51.net/article/17992.htm 
    更新时间:2009年05月05日 20:53:55   作者:  
     
    有时候我们需要动态的加入适合的js,因为有时候不需要将所有的js都加载进来,以来提高效率,但这种方法比较适合单个js文件比较大的情况
    如果js文件都比较小,还是一个js好,这样可以减少连接数。下面是4种比较常用的方法,大家可以根据情况选择,最后脚本之家 将会给推荐一个。
    1、直接document.write
    复制代码代码如下:

    <script language="javascript">
    document.write("<script src='test.js'></script>");
    </script>

    2、动态改变已有script的src属性
    复制代码代码如下:

    <script src='' id="s1"></script>
    <script language="javascript">
    s1.src="test.js"
    </script>

    3、动态创建script元素
    复制代码代码如下:

    <script>
    var oHead = document.getElementsByTagName('HEAD').item(0);
    var oScript= document.createElement("script");
    oScript.type = "text/javascript";
    oScript.src="test.js";
    oHead.appendChild( oScript);
    </script>

    这三种方法都是异步执行的,也就是说,在加载这些脚本的同时,主页面的脚本继续运行,如果用以上的方法,那下面的代码将得不到预期的效果。
    要动态加载的JS脚本:a.js,以下是该文件的内容
    复制代码代码如下:

    var str = "中国";
    alert( "这是a.js中的变量:" + str );

    主页面代码:
    复制代码代码如下:

    <script language="JavaScript">
    function LoadJS( id, fileUrl )
    {
    var scriptTag = document.getElementById( id );
    var oHead = document.getElementsByTagName('HEAD').item(0);
    var oScript= document.createElement("script");
    if ( scriptTag ) oHead.removeChild( scriptTag );
    oScript.id = id;
    oScript.type = "text/javascript";
    oScript.src=fileUrl ;
    oHead.appendChild( oScript);
    }
    LoadJS( "a.js" );
    alert( "主页面动态加载a.js并取其中的变量:" + str );
    </script>

    上述代码执行后 a.js 的 alert 执行并弹出消息,
    但是 主页面产生了错误,没有弹出对话框。原因是 'str' 未定义,为什么呢?因为主页面在取 str 的时候 a.js 并没有完全加载成功。遇到需要同步执行脚本的时候,可以用下面的第四种方法。
    4、原理:用XMLHTTP取得要脚本的内容,再创建 Script 对象。
    注意:a.js必须用UTF8编码保存,要不会出错。因为服务器与XML使用UTF8编码传送数据。
    主页面代码: 
    复制代码代码如下:

    <script language="JavaScript">
    function GetHttpRequest()
    {
    if ( window.XMLHttpRequest ) // Gecko
    return new XMLHttpRequest() ;
    else if ( window.ActiveXObject ) // IE
    return new ActiveXObject("MsXml2.XmlHttp") ;
    }
    function AjaxPage(sId, url){
    var oXmlHttp = GetHttpRequest() ;
    oXmlHttp.OnReadyStateChange = function()
    {
    if ( oXmlHttp.readyState == 4 )
    {
    if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
    {
    IncludeJS( sId, url, oXmlHttp.responseText );
    }
    else
    {
    alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ;
    }
    }
    }
    oXmlHttp.open('GET', url, true);
    oXmlHttp.send(null);
    }
    function IncludeJS(sId, fileUrl, source)
    {
    if ( ( source != null ) && ( !document.getElementById( sId ) ) ){
    var oHead = document.getElementsByTagName('HEAD').item(0);
    var oScript = document.createElement( "script" );
    oScript.language = "javascript";
    oScript.type = "text/javascript";
    oScript.id = sId;
    oScript.defer = true;
    oScript.text = source;
    oHead.appendChild( oScript );
    }
    }
    AjaxPage( "scrA", "b.js" );
    alert( "主页面动态加载JS脚本。");
    alert( "主页面动态加载a.js并取其中的变量:" + str );
    </script>

    现在完成了一个JS脚本的动态加载。
    复制代码代码如下:

    var Rash=true;
    var msg="";
    function norash()
    {
    if (confirm("确定要取消吗"))
    Rash=false;
    }
    function rashit()
    {
    setInterval('getrss()',Inttime);
    }
    function getrss()
    {
    if (Rash==true)
    {
    head=document.getElementsByTagName('head').item(0);
    script=document.createElement('script');
    script.src='INCLUDE/AutoUpdate.asp';
    script.type='text/javascript';
    script.defer=true;
    void(head.appendChild(script));
    window.status=msg;
    }
    }
    rashit();
     

    怎么判断js脚本加载完成

    https://www.jb51.net/article/47394.htm

    在“按需加载”的需求中,我们经常会判断当脚本加载完成时,返回一个回调函数,那如何去判断脚本的加载完成呢?

    我们可以对加载的 JS 对象使用 onload 来判断(js.onload),此方法 Firefox2、Firefox3、Safari3.1+、Opera9.6+ 浏览器都能很好的支持,但 IE6、IE7 却不支持。曲线救国 —— IE6、IE7 我们可以使用 js.onreadystatechange 来跟踪每个状态变化的情况(一般为 loading 、loaded、interactive、complete),当返回状态为 loaded 或 complete 时,则表示加载完成,返回回调函数。

    对于 readyState 状态需要一个补充说明:

    1.在 interactive 状态下,用户可以参与互动。
    2.Opera 其实也支持 js.onreadystatechange,但他的状态和 IE 的有很大差别。

    复制代码代码如下:

    <script>

    function include_js(file) {
        var _doc = document.getElementsByTagName('head')[0];
        var js = document.createElement('script');
        js.setAttribute('type', 'text/javascript');
        js.setAttribute('src', file);
        _doc.appendChild(js);

        if (!/*@cc_on!@*/0) { //if not IE
            //Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload
            js.onload = function () {
                alert('Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload');
            }
        } else {
            //IE6、IE7 support js.onreadystatechange
            js.onreadystatechange = function () {
                if (js.readyState == 'loaded' || js.readyState == 'complete') {
                    alert('IE6、IE7 support js.onreadystatechange');
                }
            }
        }

        return false;
    }


    include_js('http://www.planabc.net/wp-includes/js/jquery/jquery.js');
    </script>

    饮水思源,不忘初心。 要面包,也要有诗和远方。
  • 相关阅读:
    Java-WebDriver模块
    Java-数据类型(八中基本数据类型)
    Java基础
    Java介绍
    Eclipse介绍
    Jmeter-服务器监控技术
    性能测试
    Jmeter-相关字段含义
    Jmeter-监听器
    Jmeter-BeanShell组件应用
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/14721402.html
Copyright © 2020-2023  润新知