`

Extjs dynamic load the js and css file

 
阅读更多

当开发大型Extjs的项目的时候,都会遇到重复load的问题,所以我们就要就行关于这个,防止Extjs重复load

 

这里我提出解决方案:

 

 

/**
 * Script Manager class
 */
Ext.ux.ScriptManager = Ext.extend(Ext.util.Observable, {
    // The timeout in seconds to be used for requests
    timeout : 30,
 
   /**
    * @private
    * Array which will hold the scripts
    */
    scripts : [],
 
    // Whether to cache the javascript files or not
    disableCaching : false,
 
    /**
     * @constructor
     * 
     * Component constructor
     */
    constructor: function(config){
        Ext.apply(this, config);
 
        // Call our superclass constructor to complete construction process.
        Ext.ux.ScriptManager.superclass.constructor.call(this, config)
    },
 
    /**
     * Accepts the config for loading Javascript files
     * @param {Object} o Config options
     */
    loadJs : function(o){
        if (!o) {
            return;
        }
 
        if (o.debug) {
            this.addAsScript(o);
            return;
        }
 
        if (!Ext.isArray(o.scripts)) {
            o.scripts = [o.scripts];
        }
 
        o.url = o.scripts.shift();
 
        if (o.scripts.length == 0) {
            this._loadUrl(o);
        } else {
            o.scope = this;
            this._loadUrl(o, function() {
                this.loadJs(o);
            });
        }
    },
 
    /**
     * Loads the css files dynamically
     *
     * @param {Object} o Config options -
     * {Array} scripts Array of css file paths |
     * {String} id Any existing css file with this id will be overwritten by the new file |
     * {Function} callback Function to be called once the files are loaded | 
     * {Object} scope On this scope the callback function will be called
     *
     * @returns void
     */
    loadCss : function(o) {
        var id = o.id || '';
        var file;
 
        if (!Ext.isArray(o.scripts)) {
            o.scripts = [o.scripts];
        }
 
        for (var i = 0; i < o.scripts.length; i++) {
            file = o.scripts[i];
            id = '' + Math.floor(Math.random() * 100);
            Ext.util.CSS.createStyleSheet('', id);
            Ext.util.CSS.swapStyleSheet(id, file);
        }
 
        if(o.callback && Ext.isFunction(o.callback)){
            o.callback.createDelegate(o.scope || window).call();
        }
    },
 
    /**
     * Adds the JS and CSS files as respective tags in DOM. This feature is used in debug:true option
     * @param {Object} o Config options
     * @returns void
     */
    addAsScript : function(o) {
        var count = 0;
        var script;
        var files = o.scripts;
        if (!Ext.isArray(files)) {
            files = [files];
        }
 
        var head = document.getElementsByTagName('head')[0];
 
        Ext.each(files, function(file) {
            script = document.createElement('script');
            script.type = 'text/javascript';
            if (Ext.isFunction(o.callback)) {
                script.onload = script.onreadystatechange = function() {
                    count++;
                    if (count == files.length) {
                        o.callback.call();
                    }
                }
            }
            script.src = file;
            head.appendChild(script);
        });
    },
 
    /**
     * @private
     *
     * Sends the AJAX request for loading the Javascript file
     * @param {String} url Url of the file to be loaded or the 
     * config object with array of urls ans other config options
     *
     * @param {Function} callback Callback function which 
     * will be called once all the files are loaded
     *
     * @returns Null
     */
    _loadUrl : function(url, callback) {
        var cfg, callerScope;
 
        // If
        if (typeof url == 'object') { // must be config object
            cfg = url;
            url = cfg.url;
            callback = callback || cfg.callback;
            callerScope = cfg.scope;
            if (typeof cfg.timeout != 'undefined') {
                this.timeout = cfg.timeout;
            }
            if (typeof cfg.disableCaching != 'undefined') {
                this.disableCaching = cfg.disableCaching;
            }
        }
 
        // If the url exists in the scripts array, then call the callback function
        // This works as an recursive function call for multiple files
        if (this.scripts[url]) {
            if(callback && Ext.isFunction(callback)){
                callback.createDelegate(callerScope || window).call();
            }
            return null;
        }
 
        // Ajax request for loading the file
        Ext.Ajax.request({
            url : url,
            success : this.processSuccess,
            failure : this.processFailure,
            scope : this,
            timeout : (this.timeout * 1000),
            disableCaching : this.disableCaching,
            argument : {
                'url' : url,
                'scope' : callerScope || window,
                'callback' : callback,
                'options' : cfg
            }
        });
 
        return null;
 
    },
 
    /**
     * @private
     * Function will be called if Ajax loading of scripts are successfull
     * @param {Object} response Ajax response object which will contain the script file content
     * @returns void
     */
    processSuccess : function(response) {
        this.scripts[response.argument.url] = true;
        window.execScript ? window.execScript(response.responseText) : window
        .eval(response.responseText);
        if (response.argument.options.scripts.length == 0) {
        }
        if (typeof response.argument.callback == 'function') {
            response.argument.callback.call(response.argument.scope);
        }
    },
 
    /**
     * @private
     * Function will be called if Ajax loading of scripts fails. It shows an error alert
     * @param {Object} response Ajax response object which will contain the script file content
     * @returns void
     */
    processFailure : function(response) {
        Ext.MessageBox.show({
            title : 'Application Error',
            msg : 'Script library could not be loaded.',
            closable : false,
            icon : Ext.MessageBox.ERROR,
            minWidth : 200,
            buttons: Ext.Msg.OK
        });
        setTimeout(function() {
            Ext.MessageBox.hide();
        }, 2000);
    }
});
 
// Create an instance of the Script Manager
ScriptMgr = new Ext.ux.ScriptManager();

 

 

使用这个的方法:

 

ScriptMgr.loadJs({
    scripts : ['file1.js', 'file2.js'],
    debug : false,
    callback : function(){
        console.log('loaded');
    }
});

 使用这个调用CSS

 

ScriptMgr.loadCss({
     scripts : ['path/to/file1.css', 'path/to/file2.css']
});

 

 

ScriptMgr.loadCss({
     scripts : 'path/to/file1.css',
     id : 'file_to_be_overridden'
});
ScriptMgr.loadCss({
     scripts : 'path/to/file2.css',
     id : 'file_to_be_overridden'
});
 

 

在实战中使用这个:

 

Ext.onReady(function(){
    var panel = new Ext.Panel({
        renderTo : document.body,
        title : 'My Panel',
        html: 'Hello World!',
        width : '100%',
        height : 400,
        tbar : [{
            // A toolbar button with open window handler
            text : 'Open Window',
            scope : this,
            handler : function(){
                ScriptMgr.loadJs({
                    scripts : 'LargeWindowComp.js',
                    callback : function(){
                        // The window file is surely loaded now.
                        // We can create the window instance
                        var win = new LargeWindowComp({
                            width : 400,
                            height : 300,
                            title : 'I am loaded now'
                        });
 
                        win.show();
                    }
                });
            }
        }]
    });
});
 

 

 

分享到:
评论

相关推荐

    extjs4.0引用的JS和CSS

    本资源包含的是ExtJS 4.0版本中需要用到的主要JavaScript库文件和CSS样式文件,这些文件对于理解和使用ExtJS 4.0至关重要。 JavaScript 文件: 1. **ext-all.js**:这是ExtJS的核心库文件,包含了所有组件、功能和...

    ExtJs中Store加载(load)时候提示信息

    在开发基于ExtJS框架的应用程序时,处理数据加载与用户交互是至关重要的环节。当Store在加载(load)数据过程中,向用户提供明确的提示信息,不仅能够提升用户体验,还能增加应用的专业度。以下是对如何在ExtJS中...

    css.rar_FAC657、COM_c2ecb2;color:_extjs4_extjs的库_html aef css包装

    ExtJS 4是一个功能强大的JavaScript框架,用于构建富客户端Web应用程序。它的核心是其主题(Theme)系统,允许开发者自定义界面的外观和感觉。在提供的压缩包“css.rar”中,我们关注的是与ExtJS 4主题相关的CSS资源...

    Extjs4的FormPanel从后台load json数据的要点

    通过以上内容的介绍,我们可以了解到在Extjs4中如何利用`form.load()`方法实现从后台加载JSON数据,并将其映射到表单字段中显示的过程。这不仅有助于提高开发效率,还能增强应用程序的灵活性。希望本文能够帮助您更...

    ExtJS主题CSS

    ExtJS是一款强大的JavaScript框架,主要用于构建富客户端应用。它的核心特性包括组件化、数据绑定、丰富的用户界面组件以及可扩展的API。在ExtJS中,主题(Theme)扮演着至关重要的角色,它允许开发者根据品牌需求...

    Extjs 2.2 Extjs 3.21 js

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。这个压缩包包含了ExtJS的两个重要版本:2.2和3.2.1。这两个版本在Web开发领域都有着广泛的运用,它们各自拥有不同的特性和改进,对于理解...

    ExtJS之实现华丽的皮肤主题更换

     把皮肤文件解压 把css文件 如xtheme olive css 拷贝到extjs的resources目录下css文件夹里面:"&gt;extjs的默认皮肤很好看 但是我们还可以变换样式切换其他皮肤  1 直接添加其他css文件换肤 好多皮肤上网就可以收到的...

    extjs mask load

    标题“extjs mask load”指的是ExtJS框架中的一个特定功能,即在数据加载或处理过程中显示遮罩(mask)来指示用户操作正在进行中。在Web应用程序中,这通常用于提升用户体验,防止用户在数据更新期间进行其他交互,...

    extjs 进度条的显示

    在IT领域,特别是前端开发中,ExtJS是一个广泛使用的JavaScript框架,用于构建复杂的企业级Web应用程序。本文将深入探讨如何在ExtJS中实现进度条的显示,这是一个在数据加载、文件上传或任何需要用户等待的任务中...

    extjs extjs-basex.js

    extjs-basex.js extjs-basex.js extjs-basex.js

    extjs图标和图标样式css

    在EXTJS中,图标有两种主要形式:图像图标和CSS图标。 1. **图像图标**: - 图像图标是通过实际的图片文件(如`.png`、`.gif`或`.jpg`)来展示的。EXTJS默认提供了一套图标集,通常存储在`resources/images`目录下...

    EXTJS 样式 修正 css 可以调整extjs里面的字体大小

    EXTJS 样式 extjs字体大小 可以轻松在这个CSS文件里面调整EXTJS插件的字体大小,对这个有需求的同志们有福了!

    ExtJs框架系列之filetree 源码

    ExtJs框架是一款强大的JavaScript库,主要用于构建富客户端应用。在"ExtJs框架系列之filetree 源码"中,我们关注的是FileTree组件,它是一个可交互的文件系统树形视图,允许用户浏览、操作目录和文件。这个组件在Web...

    Extjs 6.2 主题 triton

    ExtJS 是一个强大的JavaScript框架,主要用于构建富客户端的Web应用程序。它提供了丰富的组件库和一个MVC(Model-View-Controller)架构,使得开发者能够创建功能丰富的、交互式的用户界面。在ExtJS 6.2版本中,...

    ExtJS Ext ExtJavascript Javascript

    ExtJS 是一个强大的JavaScript前端框架,专为构建富交互式的Web应用程序而设计。它提供了丰富的组件库、数据绑定、布局管理、以及强大的Ajax功能,帮助开发者创建出具有桌面级用户体验的网页应用。ExtJS 使用了Sass...

    Extjs exporter

    The Csv exporter isn't implemented and the example and compiled files are not updated (so don't use Exporter-all.js). It exports all the data in the store loaded at that time. If a grid is used it ...

    ExtJs中引用的三个js

    ExtJS 是一个强大的JavaScript 框架,专用于构建富客户端Web应用程序。它提供了一整套组件、布局管理和数据绑定机制,使得开发者可以构建出功能丰富、交互性强的用户界面。在“ExtJs中引用的三个js”这个主题中,...

    ext-3.21.rar 整合了css+div+js的高效完美ExtJS

    ExtJS是一种基于JavaScript的开源富客户端框架,专为构建企业级Web应用程序而设计。它结合了CSS、HTML(通常以Div元素表示)和JavaScript技术,提供了丰富的用户界面组件和高度可定制的交互体验。在“ext-3.21.rar”...

    extjs实例 入门,提供ext所需要的资源文件,详细叙述怎么改变文件颜色

    ExtJS 是一个强大的JavaScript前端框架,用于构建交互式的Web应用程序。它提供了丰富的组件库、数据绑定、布局管理和可自定义的UI元素。本实例将帮助初学者了解如何使用ExtJS入门,并通过提供的资源文件学习如何改变...

    简单的JS+CSS 仿 EXTJS GRID 表单 效果

    简单的JS+CSS 仿 EXTJS GRID 表单 效果 ,IE自己稍微处理一下,

Global site tag (gtag.js) - Google Analytics