对于一个复杂的系统来说,客户端的JS可能会有上百个,如果全部加载到用户的浏览器中,一方面会导致多余的网络传输,另一方面浏览器解析大量的Js会导致性能下降,这两点都会显著的影响用户可察觉性能。所以对于Js的加载,是动态进行的,这个动态进行表现为两种方式:
- 能不加载的Js就绝不加载。
- 需要加载的Js在直到确实用到的时候才加载。
1,能不加载的Js就绝不加载
拿登陆的流程为例:
尝试登陆包含两种情况,一种是用户刷新页面时,尝试根据当前的令牌自动登陆,另一种是用户在上一次登录时保存了用户名和密码,这两种情况无论哪一种登陆成功了,都不需要用户再次登陆了,从而也就不需要加载FormLogin这个Js了。
2,需要加载的Js在直到确实用到的时候才加载
对于功能模块来说,仅当当前用户具有该模块的权限时,才会生成显示相关的菜单项。而今当该模块的某一个菜单项目第一次被点击时,该模块的相关Js才会被加载:
3,基于ExtJs Ajax的Js加载
ExtJs中的Ajax调用是异步的,而动态加载Js通常意味着在该Js加载完成后调用一个函数,且该函数可能是要加载的Js中的一个函数,所以上图对应的代码应该这样写:
Srims.Action.actions = {
'project-vertical-list': function(){
Srims.Action._callProjectAction('Srims.projects.listVerticalProject();');
},
'project-horizontal-list': function(){
Srims.Action._callProjectAction('Srims.projects.listHorizontalProject();');
}
};
Srims.Action._callProjectAction = function(fn){
if (Srims.projects) {
eval(fn);
}
else {
Srims.loadProjectModule(fn);
}
}
Srims.loadProjectModule = function(callbackFunctionString){
Ext.namespace('Srims.projects');
var js = ["/srims/projects/projectLevel.js"];
js[js.length] = "/srims/projects/projectState.js";
js[js.length] = "/srims/projects/project.js";
js[js.length] = "/srims/projects/projectStore.js";
js[js.length] = "/srims/projects/projectGridPanel.js";
js[js.length] = "/srims/projects/projectAction.js";
Srims.loadJs(js, function(){
eval(callbackFunctionString)
});
}
当要执行的函数为要加载的Js中包含的函数时,函数名称当参数传递,加载完毕后,调用eval执行该函数。
真正执行加载操作的是Srims.loadJs这个函数,它接受两个参数:第一个参数是要加载的Js——可以是一个Js,也可以是一个Js数组;第二个参数是加载完毕后的回调函数。当要加载的是一个Js时,加载很简单:发起Ajax请求,对取得的结果用eval执行,然后eval回调函数;当要加载的是一系列Js时(就像上面代码中那样),情况会复杂一点,需要递归的调用loadJs,直到所有Js加载完毕,然后eval回调函数。以下是代码:
1: Srims.JsToLoad = undefined;
2: Srims.JsLoadCallBack = undefined;
3: Srims.loadJs = function(js, callback){
4: Srims.JsToLoad = js;
5: Srims.JsLoadCallBack = callback;
6: Srims._loadJs();
7: }
8: Srims._loadJs = function(){
9: var js = Srims.JsToLoad;
10: var callback = Srims.JsLoadCallBack;
11:
12: if (Ext.type(Srims.JsToLoad) != 'string') {
13: if (Srims.JsToLoad.length == 1) {
14: js = Srims.JsToLoad[0];
15: callback = Srims.JsLoadCallBack;
16: }
17: else {
18: js = Srims.JsToLoad.shift();
19: callback = Srims._loadJs;
20: }
21: }
22:
23: Ext.Ajax.request({
24: url: '/javascript' + js,
25: success: Srims._onLoadJs,
26: method: 'GET',
27: scope: callback
28: });
29: }
30: Srims._onLoadJs = function(response){
31: eval(response.responseText);
32: this();
33: }
请注意第19行,回调函数为本身,导致了递归。
<script type="text/javascript"></script>
分享到:
相关推荐
标题“Extjs 动态加载树”涉及到的是一个前端开发技术话题,主要集中在使用Extjs框架构建能够动态加载数据的树形结构。Extjs是一个基于JavaScript的组件化UI库,常用于开发富客户端应用。动态加载树(Dynamic ...
动态加载菜单是ExtJS中的一个关键特性,它允许在用户交互过程中动态地创建、修改和加载菜单项,提供了更灵活的用户界面设计。在“Extjs动态加载菜单”这个主题中,我们将深入探讨这一功能的实现方式以及相关技术。 ...
标签“源码”和“工具”暗示了这篇博客可能还讨论了EXTJS的源代码以及如何使用EXTJS作为开发工具来实现动态加载功能。EXTJS的源码可以提供深入的理解,帮助开发者调试和优化代码。EXTJS提供的各种工具,如`sencha ...
动态加载JS(Dynamic JavaScript Loading)是现代Web开发中的一个重要技术,它可以提高页面的加载速度,减少初始加载的数据量,并在需要时按需加载资源,从而优化用户体验。 在ExtJS 3中,虽然没有像ExtJS 4那样...
本系统采用EXTJS进行前端开发,EXTJS是一款强大的JavaScript组件库,以其丰富的UI组件和数据绑定机制,为开发高质量的Web应用提供了便利。 EXTJS的核心特性包括: 1. **组件化设计**:EXTJS以组件为中心,提供了...
在IT领域,特别是Web开发中,ExtJS是一个广泛使用的JavaScript框架,它提供了丰富的用户界面组件和强大的数据管理功能。本文将深入探讨如何使用ExtJS构建动态异步加载的树形结构,结合AJAX技术实现JSON数据的高效...
2. **定义动态加载的函数** 创建一个函数,用于根据需求加载指定的面板或HTML内容。这个函数可以接收一个参数,如面板ID或配置对象。 ```javascript function loadTab(config) { var panel = Ext.create('Ext....
ExtJS 4.0 是一个强大的JavaScript框架,用于构建富客户端Web应用程序。它引入了全新的MVC(Model-View-Controller)设计模式,这使得应用的结构更加清晰,代码更易于管理和维护。在这个主题中,我们将深入探讨如何...
动态加载JavaScript文件的基本原理是利用`<script>`标签的异步加载特性或者使用`XMLHttpRequest`或`fetch` API来创建HTTP请求获取JS文件。下面我们将深入探讨这两种方法: 1. **使用`<script>`标签**: 在HTML中,...
动态树加载菜单是 ExtJS 中一种常见且实用的功能,它允许用户在需要时按需加载树节点,从而提高应用性能,减少初次加载时的数据量。 动态树加载,也称为懒加载或按需加载,是指在用户滚动、展开节点或执行其他操作...
ExtJS Tree是Ext JS库中的一个组件,用于创建和展示层次结构的数据,通常表现为树形结构。这个组件在Web应用程序中广泛使用,特别是在需要管理有层级关系的数据时,如文件系统、组织架构或者导航菜单等。动态加载是...
demo描述: 1. 页面主框架是左是一个tree,...2. 左边的树是加载主页面的时候动态生成 3. 点击左边的树的节点动态加载controller生成一个table 注:需要自己导入Extjs 4.2.x 的文件,该demo是用Extjs 4.2.1 写的
在“Extjs4.2 动态加载项目(权限模块)”中,动态加载主要体现在两个方面:一是对代码的懒加载,二是针对权限控制的动态加载。 1. **代码懒加载**:在大型应用中,所有类一次性加载可能会导致页面加载速度变慢。通过...
【基于ExtJS开发的酒店管理系统C#源码】 在当今的信息化时代,酒店管理系统的开发已经成为提高酒店运营效率的关键工具。本系统采用先进的Web技术,特别是JavaScript库ExtJS,结合后端C#语言,构建了一个功能完备、...
ExtJS是一种基于JavaScript的前端开发框架,由Sencha公司开发,用于构建富互联网应用程序(Rich Internet Applications,简称RIA)。这个“基于ExtJS开发的酒店管理系统源码”提供了一个完整的解决方案,帮助开发者...
ExtJS 4中动态加载的路径设置 Extjs4 API文档阅读(一)——类系统(Class System) Extjs4 API文档阅读(三)——布局和容器 Extjs4 API文档阅读(二)——MVC构架(上) Extjs4 API文档阅读(二)——MVC构架(下) Extjs4...
这些ExtJs的实例可能涵盖了从基础组件的使用到复杂应用的构建,例如数据网格的动态加载、表单验证、图表绘制等。通过实践这些实例,开发者能够将理论知识转化为实际操作,加深对ExtJs的理解。 3. **可视化工具**:...
2. **核心组件文件**:在开发过程中,我们可能需要引用特定的组件库,如`ext-grid.js`(表格组件)、`ext-form.js`(表单组件)、`ext-tree.js`(树形组件)等。这些文件提供了构建用户界面所需的组件,例如数据网格...
【EXTJS 3.4 开发前准备】 EXTJS 是一款强大的JavaScript库,主要用于构建桌面级的Web应用程序,提供丰富的用户界面组件和交互效果。3.4版本是EXTJS的一个重要里程碑,它提供了稳定的基础和丰富的组件库。本文将...
6. 对大量JavaScript脚本进行压缩,如使用JS Builder工具,提升页面加载速度。 EXTJS的调试通常需要参考Debug版本的加载顺序,例如从`ext.jsb`文件分析。在部署时,确保正确引用Release版本的脚本文件,以实现性能...