zoukankan      html  css  js  c++  java
  • 异步加载js文件并执行js方法:实现异步处理网页的复杂效果

        有这么一个场景,当你的网页页面效果过多就会造成了打开页面的速度变得缓慢,长时间处于加载的状态,这样的效果通常会让用户感到不友好,通常的处理方法是先加载基本的html,然后再加载其他的网页效果,让用户感觉到页面一下子就出来了,然后其他的网页效果再慢慢的展现出来。

        这里通过JSLoader组件来实现这种前端的效果

    var JSLoader = function(){

    var scripts = {}; // scripts['a.js'] = {loaded:false,funs:[]}

    function getScript(url){
    var script = scripts[url];
    if (!script){
    script
    = {loaded:false, funs:[]};
    scripts[url]
    = script;
    add(script, url);
    }
    return script;
    }


    function run(script){
    var funs = script.funs,
    len
    = funs.length,
    i
    = 0;

    for (; i<len; i++){
    var fun = funs.pop();
    fun();
    }
    }

    function add(script, url){
    var scriptdom = document.createElement('script');
    scriptdom.type
    = 'text/javascript';
    scriptdom.loaded
    = false;
    scriptdom.src
    = url;

    scriptdom.onload
    = function(){
    scriptdom.loaded
    = true;
    run(script);
    scriptdom.onload
    = scriptdom.onreadystatechange = null;
    };

    //for ie
    scriptdom.onreadystatechange = function(){
    if ((scriptdom.readyState === 'loaded' ||
    scriptdom.readyState
    === 'complete') && !scriptdom.loaded) {

    run(script);
    scriptdom.onload
    = scriptdom.onreadystatechange = null;
    }
    };

    document.getElementsByTagName(
    'head')[0].appendChild(scriptdom);
    }

    return {
    load:
    function(url){
    var arg = arguments,
    len
    = arg.length,
    i
    = 1,
    script
    = getScript(url),
    loaded
    = script.loaded;

    for (; i<len; i++){
    var fun = arg[i];
    if (typeof fun === 'function'){
    if (loaded) {
    fun();
    }
    else{
    script.funs.push(fun);
    }
    }
    }
    }
    };
    }();

    调用方法示例:

    先在页面上加载JSLoader.js文件

    然后执行

     JSLoader.load('js/test.js' , function () {a();})

    表示异步加载test.js文件,并且加载完成后再执行a()方法,a()方法是test.js里面的方法,a()方法就是负责渲染一些前端页面的网页效果来的。

    不过该方法在ie7下并不会产生异步的效果,在ie7下需要使用延时触发器来包装一下,如:

    setTimeout(" JSLoader.load('js/test.js' , function () {a();})", 1);

  • 相关阅读:
    ASP.NET 2.0 解决了 CodeBehind 需要控件声明同步的问题
    Script# 把 C# 编译为 JavaScript
    我不懂 ASP.NET
    ASP.NET 是如何让 aspx 完全编译的呢?
    ASP.NET 设计优秀之处
    .NET 的灵魂是什么?
    初次使用Atlas JavaScript (Part 2 Web Service扩展)
    XNA Microsoft 平台的新游戏框架
    ViewState ASP.NET 的一个特有存储容器
    2 Ways Thinking In Ajax
  • 原文地址:https://www.cnblogs.com/linzheng/p/2160606.html
Copyright © 2011-2022 走看看