- 浏览: 74511 次
- 性别:
- 来自: 天津
-
文章分类
最新评论
-
tamsiuloong:
不错,基本操作全写上了。
哥们,有没有cvsnt window ...
Windows7下的CVSNT安装配置,用户分配 -
eason007:
<p>js的动态加载,要处理异步不 ...
JavaScript中的对象动态加载技术 -
eason007:
ajax方式是不能加载跨域文件的。
JavaScript中的对象动态加载技术 -
eueuy:
<div class="quote_title ...
JavaScript中的对象动态加载技术 -
dzxiang:
<div class="quote_title ...
JavaScript中的对象动态加载技术
什么是JavaScript对象动态加载
JavaScript动态加载(JavaScript Object Dynamic Loading) - 之所以叫做动态,是应为其有别与通常的静态加载形式。
典型的JavaScript静态加载方式,是通过<script>标签将我们可能需要的所有JS文件依次嵌入到一个HTML页面中,当浏览器执行到<script> 标签,就会到我们指定的地方去加载JavaScript并运行,这时,文件中定义的无论方法、类、对象等,已经存在与浏览器,等待被使用。除非HTML页面被Unload,否则这些东西就一直存在。
而典型的动态加载方式,是不需要任何提前的准备,只有当需要一个JavaScript对象来为我们服务时,我们就临时去加载它所属的JS文件,然后使用它,使用完毕,销毁即可。正所谓“呼之即来,挥之即去”。
就因为这“呼之即来,挥之即去”的能力,使得JavaScript真正的活了起来。
JS动态加载解决了什么问题
- 给系统减了肥:可以将不必要的JavaScript代码延迟加载,未用到的功能不加载。
- 模块化得以实现:可以将原本大块的功能或类,分解成合理的小块,便于管理与维护。
- 方便的值传递:双向传值,无拘束。基于JSON,可以传递大对象。
- 可以实现Service:可以基于Service理念,通过核心JavaScript对象使用其他的服务功能对象,完成业务的组装。
JS动态加载应该有什么能力
- 可以异步的,或同步的,随心所遇加载外部JS文件。
- 加载进来的JS文件的内容可以有效管理,包括作用域,开放性,生命周期。
- 可以支持面向对象,以对象为基本点而不是方法或变量等。
- 有好的封装,可以通过一个句柄操作整个被加载的JS。
传统JS动态加载的实现
关于JS动态加载的实现,我见过很多种方法。早期的时候,人们想过很多办法。这些办法有自己发挥的空间,可以解决一些问题。但是都或多或少的存在弊端,以及实现上的繁琐,最大的问题就是,它们基本都不是面向对象的。下面就列举主要的2类:
- 用嵌套iFrame的方式来加载JS文件:这种方式早期最多,通过在页面中包含一个iFrame,来调用一个另一个包含了<script>标签的HTML页面,实现JS的动态加载。最大的弊端就是无法传递参数,实现较繁琐。
- 临时创建<script>标签:这种方式有很多人用。利用JavaScript操作页面Dom模型,临时创建一个<script>标签,然后appendChild到<body>上,或者动态改变已存在<scirpt>标签的src属性。弊端是只能同步加载,必须等待JS文件被读取完毕,才能进行下一步工作。且传值是通过调用被加载的JS内的变量实现,双向传值困难,作用域弱化。
可以看出以上两种常见方式,都无法满足我们的要求。
更优秀的解决方案
得益于神奇如阿拉丁神灯般的 eval() ,我们就可以实现以上所有的愿望 :) 。
绕了那么大圈子,想了那么多办法。其实最简单的方法就在眼皮底下.
第一部分-调用方 main.js文件:
//动态读取JS对象的方法
//@FileName:要读取的JS对象URL,可以是本地路径。
//@TheParameters:需要传递给被加载对象的参数,可以是任何对象。
function loadJSObj(FileName,TheParameters){
Ext.Ajax.request({ //异步调用方法
url: FileName, //调用URL
scope: this,
success: function(response){ //成功后的回调方法response为返回内容
var remoteObj = eval(response.responseText);
var mod = null;
mod = new remoteObj(TheParameters);return mod;
},
failure:function(){ //失败后的回调方法
alert(name+' - 读取失败,请检查网络或文件。');return null;
}
});
}
这段代码使用Extjs类库封装的异步读取方法Ext.Ajax.request()。只是为了方便。如果你使用未封装的XMLHttpRequest对象也没什么问题。
先大概说下loadJSObj方法干的事情是:
- 用XMLHttpRequest来了一次Ajax请求,将想要加载的JS文件源代码读过来。
- 利用eval函数将刚才读到的远程JavaScript类实例化成为本地的对象(期间传递了构造参数)。
- 返回这个对象,供使用。
此处关键的代码在于
var remoteObj = eval(response.responseText);
var mod = null;
mod = new remoteObj(TheParameters);return mod;
可以看到,我们直接将被读取的JS文件传进eval 函数执行。并返回一个叫做 remoteObj的东西,这个东西其实就是被读取的JS的句柄(一个类,定义在被读取JS中的类,后面会详细说到),通过将remoteObj实例化,即mod = new remoteObj(参数) 就可以通过 mod 对象对被读取的JS随心所欲了操作了。
如此一来,远程的JS就被我们按照参数中指定的要求实例化成本地对象了,可以使用了。但是…这只是一相情愿。因为被读取的JS得符合我们的要求,才能“两厢情愿”,最终得到结果…
第二部分 - 被调用方 login.js文件:
要想符合要求,被读取的JS文件也必须按照一定的规则来写。
//用户登录类
Ext.extend(eueuy.module,{
init:function(){
//==Variables==//
var userName = this.parameters.un; //获取传递进来的参数un
var passWord = this.parameters.pwd; //获取传递进来的参数pwd
//==Methods==//
//登录方法
function loginOn(){
if (userName=='eueuy' || passWord=='123'){
return true;
}else{
return false;
}
}
//登出方法
function loginOff(){
alert('欢迎再来');}
}
});
我们先看看这个登录类干了什么:
- 继承自eueuy.moudle,并重写了构造函数。
- 接收了2个传递进来的初始化参数,un 和 pwd。
- 定义了2个成员方法和一个成员变量。
没有任何特别的东西,就是Ext.extend方法用的有点怪,区别于平常的 XXX = Ext.extend();
没有赋值符号和类名。这恰恰是一个关键点:
类的名字必须留空
为什么这样写?因为这样一来,这个没有类名的类, 就可以在eval()函数执行他的时候,再给他定义类名,这样就将类名的定义留在了调用的时候,也就是main.js文件中。这个小技巧也将使调用方(main.js)可以直接控制被调用方(login.js)的类。
最后,就可以在main.js中用下面的代码,通过动态加载用户登录类,进行用户登录验证的工作:
var loginModel = loadJSObj('http://www.eueuy.name/project1/js/login.js',{un:’eueuy’,pwd:’123’});
if (loginModel.loginOn()){
alert('登录成功,欢迎'+loginModel.userName);
}else{
alert('登录失败,错误的用户名密码');
}
可以看到,在上面的代码中,我们通过loginModel这个变量,控制了login.js中的登录类,可以访问其中的方法loginOn() ,还可以访问其中的变量 userName。
结尾
至此,对象动态加载技术的理论已经讲解的差不多了,再下一篇博文中,我还会依据这些理论,给大家贴出一个基于动态加载的的项目框架。这个框架可以方便的实现One-Page,还可以看到一些具体的应用。
评论
<p> </p>
<p>贴点我自己的框架的代码,和yui的有点像。</p>
<pre name="code" class="js">EAS_JS.Script
.build({
name : 'jquery',
url : 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'
})
.build({
name : 'local',
def : function () {
$('#test').html($('#test').html() + 'local > ');
}
})
.build({
name : 'test',
url : 'http://www.w2blog.net/Templates/script/opFeedback.js'
})
.build({
name : 'index',
def : function () {
$('#test').html($('#test').html() + 'index > ');
},
requires : ['jquery', 'local', 'test']
});
EAS_JS.Script.run({
name : 'index'
});</pre>
<p> </p>
var mod = new remoteObj(TheParameters);
突然出现一个类,lz觉得这种方法好吗?
这个方法最早出现在2006年的csdn上,用于图片切换。
主要用途不是为了什么动态加载(lz的动态加载的理解还是有问题。难道你会把不会用到的<script标签加载进来吗?而且lz提出的挥之则去,怎么挥之则去?eval了还想去掉?所以相比script,如果单单只是从动态加载上考虑,可以说没有任何意义),而是为了核心js代码隐藏。但是Lz的这种做法还是太简单了,远远达不到代码隐藏的程度。
将MOD对象释放即可
与我现在的项目中用到的方式基本一样,我想了解一下楼主关于“将MOD对象释放”,是如何做的?
mod = null;
如果愿意还可以调用一下 GC函数 ,不过内存稍紧张的时候,效果才明显。
var mod = new remoteObj(TheParameters);
突然出现一个类,lz觉得这种方法好吗?
这个方法最早出现在2006年的csdn上,用于图片切换。
主要用途不是为了什么动态加载(lz的动态加载的理解还是有问题。难道你会把不会用到的<script标签加载进来吗?而且lz提出的挥之则去,怎么挥之则去?eval了还想去掉?所以相比script,如果单单只是从动态加载上考虑,可以说没有任何意义),而是为了核心js代码隐藏。但是Lz的这种做法还是太简单了,远远达不到代码隐藏的程度。
将MOD对象释放即可
与我现在的项目中用到的方式基本一样,我想了解一下楼主关于“将MOD对象释放”,是如何做的?
var mod = new remoteObj(TheParameters);
突然出现一个类,lz觉得这种方法好吗?
这个方法最早出现在2006年的csdn上,用于图片切换。
主要用途不是为了什么动态加载(lz的动态加载的理解还是有问题。难道你会把不会用到的<script标签加载进来吗?而且lz提出的挥之则去,怎么挥之则去?eval了还想去掉?所以相比script,如果单单只是从动态加载上考虑,可以说没有任何意义),而是为了核心js代码隐藏。但是Lz的这种做法还是太简单了,远远达不到代码隐藏的程度。
将MOD对象释放即可
var mod = new remoteObj(TheParameters);
突然出现一个类,lz觉得这种方法好吗?
这个方法最早出现在2006年的csdn上,用于图片切换。
主要用途不是为了什么动态加载(lz的动态加载的理解还是有问题。难道你会把不会用到的<script标签加载进来吗?而且lz提出的挥之则去,怎么挥之则去?eval了还想去掉?所以相比script,如果单单只是从动态加载上考虑,可以说没有任何意义),而是为了核心js代码隐藏。但是Lz的这种做法还是太简单了,远远达不到代码隐藏的程度。
加载js文件就行了,跨域也行.不一定非要ajax
eval的执行context是在那个函数里,和你直接script标签加载是有所不同滴,存在潜在的问题。
发表评论
-
让Combox的自动完成支持模糊查询
2010-09-27 11:56 3151EXTJS提供的COMBOX有一个自动完成的功能 ,就是 ... -
将String 类型转化成想要的日期格式
2010-05-17 17:25 1102代码: //Format Date fun ... -
解决Ext.Panel中嵌套的Grid不出滚动条的问题
2010-05-15 10:27 1058原因和 WorkSpace.doLayout(); 是一样的。 ... -
[转]Ext继承关系 讲解
2010-05-12 09:24 1139Ext提供了这样的一个实用函数 Ext.extend (API ... -
[转]关于ie的内存泄漏与javascript内存释放
2010-05-04 18:31 996最近做一个公司的业务 ... -
[转]EXT 中的面向对象特性小结
2010-05-04 18:00 7391.命名空間: 對類的定義方式Extjs 代碼: Ext. ... -
ExtJs 及 Ajax 乱码解决方案
2010-02-21 11:41 6922009年4月8日整理于乌海 乱码的原因 ... -
ExtJs如何通过JSON与后台通信
2010-02-22 09:21 951How tocommunicate with serve ... -
EXT如何把一个对象转换为JSON并将其发送到服务器
2010-02-22 09:23 1112Manual:Core:Working with JSON ( ... -
如何做一个两列的FormPanel
2010-02-23 20:04 1038有时一个FormPanel 放很多输入框会变的很长,这时候需要 ... -
为什么ext combox 下拉框不出现自动提示/自动选中
2010-02-23 20:06 957ext combox 如果想实现类似于 baidu 搜索时的提 ... -
ExtJs 中一个Toolbar 不够用?再来一个!
2010-02-23 20:07 888var grid = new Ext.grid.GridPa ... -
如何使开启了分页功能的EXT Combox可以自动选中非第一页的值
2010-02-23 20:08 810当我们在Combox 中定义了PageSize属性,那么Com ... -
解决EXT DateField 用getValue() 发送到后台,后台取null的问题
2010-02-23 20:09 1252var searchContractDate = new Ex ... -
如何把Ext.data.store里的数据一次性用JSON传给后台(添加了后台解析部分)
2010-02-23 20:10 876前台部分 首先定义一个数组,用来储存STORE里的值。 ... -
Spket的安装
2010-02-25 11:41 1376Spket的安装 1、Plugin: 最低要求: ecl ... -
JavaScript使用ACTIVEX控件引起崩溃问题的解决
2010-03-31 15:47 1470问题 在本人目前的项目中,前端部分完全使用EXTJS基于“O ... -
[转]JAVA使用JSON之Google Gson
2010-04-21 16:06 1467比如一个User对象,我想要一个框架可以直接转换成{id:10 ...
相关推荐
JavaScript的对象是动态的,即可以在运行时添加或删除属性。 #### 三、基础语法 ##### 3.1 变量与对象 在JavaScript中,创建对象可以通过以下方式: ```javascript let person = { name: "John Doe", age: 30 }; ...
JavaScript控件开发是一种常见的Web应用开发技术,它...在"script"和"web"这些文件中,可能包含了实现上述功能的示例代码或文档,深入学习和研究这些文件,将有助于你更好地理解和实践JavaScript控件的动态加载技术。
JavaScript 面向对象技术是编程中的核心概念,尤其在Web开发中占据着举足轻重的地位。面向对象编程(Object-Oriented Programming,OOP)允许开发者通过模拟现实世界中的对象来创建复杂的软件系统。JavaScript,作为...
- **现代JavaScript与面向对象编程**:现代JavaScript程序设计中融入了许多新的概念和技术,这些技术让JavaScript应用程序与以往相比有了显著的不同。面向对象编程是现代JavaScript的一个重要组成部分。 #### 二、...
JavaScript,作为一种广泛应用于Web开发的动态脚本语言,最初被设计为简单的客户端脚本语言,但随着技术的发展,它已经发展出了丰富的面向对象编程(OOP)特性。面向对象JavaScript开发是现代Web开发中不可或缺的一...
JavaScript面向对象技术是该编程语言非常核心的一个部分,它允许开发者使用对象来组织代码,并模拟现实世界中的实体。在JavaScript中,几乎所有的东西都可以被视为对象,包括基本数据类型如数字和字符串。对象包含...
每个JavaScript对象都有一个内部`[[Prototype]]`,通常可以通过`__proto__`或`Object.getPrototypeOf`访问。原型链使得对象能够继承其他对象的属性和方法。通过`prototype`属性,我们可以为构造函数添加共享的方法:...
属性可以动态添加或删除,这使得JavaScript对象具有很高的灵活性。例如: ```javascript person.newProperty = "newValue"; delete person.age; ``` 接下来,我们谈谈数组。数组也是对象,但它们的键通常是数字,...
### 深入浅出JavaScript对象模型 #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,...
JavaScript对象的属性数量是可变的,这意味着你可以在创建对象后随时添加新的属性或修改现有属性的值。 ```javascript person.address = "China"; ``` 接下来,我们讨论数组。数组是特殊类型的对象,它们的属性是...
### JavaScript引擎在动态网页采集技术中的应用 #### 一、引言 随着互联网技术的快速发展,动态网页成为了网络上常见的内容形式之一。这类网页通常包含了客户端脚本(如JavaScript),这些脚本会在用户访问时被...
#### JavaScript对象的本质:词典模型 在深入了解如何使用面向对象的技术创建高级Web应用程序之前,理解JavaScript中的对象是如何工作的至关重要。与C++或C#等语言中的对象概念不同,JavaScript中的对象更像是一个...
值得注意的是,与传统的面向对象语言不同,JavaScript中的对象属性可以动态添加,无需预先声明。 #### 三、JavaScript中的函数 JavaScript中的函数不仅是可以执行的代码块,还是一种特殊类型的对象。这意味着函数...
Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通常使用JavaScript发起异步HTTP请求,并根据服务器返回的数据更新DOM。 #### 七、现代浏览器中的...
4. **动态性**:JavaScript的对象是动态的,可以在运行时添加、删除属性,甚至改变对象的原型。 5. **组合和模拟类**:由于JavaScript没有内置的类概念,开发者通常使用构造函数和原型模拟类的行为,通过`call`和`...
在深入理解JavaScript动态插入技术的探讨中,我们首先关注到的是动态插入技术的核心概念,即如何使用JavaScript将HTML内容动态地添加到网页中。这类技术允许开发者在不重新加载页面的情况下,修改页面的结构和内容。...
JavaScript对象的属性和方法可以通过点号(`.`)或者方括号(`[]`)来引用。例如: ```javascript var array = new Array(); array.push("abc"); // 添加元素 var length = array.length; // 获取长度 ``` 或者使用方...
ArcGIS JavaScript API 提供了丰富的地图操作接口和图层管理功能,包括加载地图服务、添加图层、查询数据、编辑要素、标注显示等。通过API,开发者可以轻松地创建出具有交互性的地图应用,将地理信息以图形化的方式...
#### 二、JavaScript对象的基本概念 在JavaScript中,对象是一种复合数据类型,它可以包含属性(键值对)。属性可以是基本类型的值(如字符串、数字等),也可以是其他复杂类型(如数组、函数或对象本身)。 - **...
课程还将通过上机实践和课堂作业加强理论知识的应用,帮助学生掌握如何利用JavaScript对象的属性和方法实现网页动态效果。例如,窗口对象提供了与浏览器窗口交互的方法,如警告框、提示框和确认框的弹出,以及窗口的...