- ajaxgo
- 等级: 初级会员
- 性别:
- 文章: 155
- 积分: 70
- 来自: 珠海
|
首先很感谢bingo,用非常新颖的思路,实现了这么一个js的loader工具。往外抛异常阻止函数运行,并在加载完后继续运行caller的做法,让人眼前一亮。不得不佩服js的世界是如此的奇妙。
在阅读bingo的js loader,获得启发的同时,也对其中的代码功能做了一些调整。例如,添加了绑定事件机制,可以预先绑定需要在加载(loaded)完后触发的操作(事件一共有5类)。规范了消息队列的实现,bingo的实现中,把消息队列耦合的太紧密。所以独立实现了一个消息队列,在loader中使用等等。整个代码经过重写,并加了注释,方便爱好者学习和探讨,也希望大家反馈bug。并且允许在include时,设置caller的scope和arguments,这样就可以在一般的函数中,比如实例方法(而不只是在匿名函数)使用include。因为,bingo的实现中,在调用caller时,只是简单的运行caller,如果在有需要作用域和需要参数传递的函数中,会失去原本的作用域和传递进来的参数。
最后,还是非常感谢bingo!
代码如下(代码下载在最后):
js 代码
-
- var jsLoader=new function() {
-
-
-
- this.NAMESPACE_TYPE={
- CLASS:'class',
- INTERFACE:'interface',
- OBJECT:'object'
- };
- this.LOADMODE_TYPE={
- PACKAGE:'package',
- FILE:'file',
- DYNAMIC:'dynamic'
- };
- this.ERROR_LEVEL={
- INFO:'@jsadk:',
- DEBUG:'*@jsadk:',
- FATAL:'!*@jsadk:',
- THROWS:'^!*@jsadk:'
- };
- this.ERRORS={};
-
-
-
- var _this=this;
- var _version='1.0a';
- var _libPath='./';
- var _errLv=this.ERROR_LEVEL.FATAL;
- var _loadmode=this.LOADMODE_TYPE.PACKAGE;
- var _packages={};
-
-
-
- this.getVersion=function() {
- return _version;
- };
- this.getLibPath=function() {
- return _libPath;
- };
- this.setLibPath=function(libPath) {
- _libPath=libPath;
- };
- this.getLoadMode=function() {
- return _loadmode;
- };
- this.setLoadMode=function(loadmode) {
- _loadmode=loadmode;
-
- };
- this.getErrLevel=function() {
- return _errLv;
- }
- this.setErrLevel=function(level) {
- _errLv=level;
- };
-
-
-
-
-
-
-
-
- var _addPKGs=function(root,pks) {
- for (var pk in pks) {
- if (typeof pks[pk]=='string') {
- root[pk]=_this.Util.initVar(root[pk],pks[pk]);
- } else if(typeof pks[pk]=='object') {
- root[pk]=_this.Util.initVar(root[pk],{});
- _addPKGs(root[pk],pks[pk]);
- }
- }
- };
-
-
-
-
- this.getPKGs=function(pack) {
- return _this.Util.eval(pack,_packages);
- };
-
-
-
-
-
- this.regPKGs=function(pkgs,ns) {
- var size=arguments.length;
- var ns=ns.split('.');
- var root=_packages;
- for (var i=0;i
- root=root[ns[i]]=_this.Util.initVar(root[ns[i]],{});
- }
- _addPKGs(root,pkgs);
- };
-
-
-
- window.onerror=function() {
- if (arguments[0].indexOf(_errLv)>-1) {
- return false;
- } else {
- return true;
- }
- };
- };
-
- with(jsLoader) {
-
-
-
- jsLoader.Util={
-
-
-
- emptyFunction:function() {},
-
-
-
-
-
- eval:function(obj,scope) {
- scope=(scope==null)?window:scope;
- if (typeof obj=='string') {
- try {
- with(scope) {
- obj=eval(obj);
- }
- } catch (e) {
- return undefined;
- }
- }
- return obj;
- },
-
-
-
-
-
- exist:function(obj,scope) {
- return (typeof this.eval(obj,scope)=='undefined'?false:true);
- },
-
-
-
-
-
- initVar:function(obj,initVal) {
- if (typeof obj=='undefined') {
- obj=initVal;
- }
- return obj;
- },
-
-
-
-
-
-
-
-
- extend:function(destination,source,fProperty,fValue) {
- for (var property in source) {
- var _property=(fProperty || Util.emptyFunction).call(source,property,destination);
- if (_property!=false) {
- var _value=(fValue!=null?
- fValue.call(source,source[property],property,destination):
- source[property]);
- destination[typeof _property=='string'?_property:property]=_value;
- }
- }
- return destination;
- }
- };
-
-
-
- (function() {
- Util.extend(Array.prototype,{
- first:function() {
- return this[0];
- },
- last:function() {
- return this[this.length-1];
- },
-
-
-
-
-
- indexOf:function(element,struct) {
- var size=this.length;
- for (var i=0;i
- if ((struct && this[i]===element) ||
- (!struct && this[i]==element)) {
- break;
- }
- }
- return (i==size?-1:i);
- },
-
-
-
-
- insertAt:function(index) {
- var args=[index,0];
- var size=arguments.length;
- for (var i=1;i
- args.push(arguments[i]);
- }
- this.splice.apply(this,args);
- },
-
-
-
-
-
- deleteAt:function(index,size) {
- result=this.splice(index,size || 1);
- return result;
- },
-
-
-
- clear:function() {
- this.length=0;
- }
- });
- })();
-
-
-
- jsLoader.EventQueue=(function() {
- Util.extend(ERRORS,{
- 'EventQueue.NO_SUCH_EVENT':ERROR_LEVEL.DEBUG+'no such a event',
- 'EventQueue.ALEADY_EXIST':ERROR_LEVEL.DEBUG+'the message is already exsited!'
- });
- var constructor=function(event) {
- this._queue={};
- this.EVENT={};
- for (var e in event) {
- this.EVENT[event[e]]=true;
- this._queue[event[e]]=[];
- }
- };
- Util.extend(constructor.prototype,{
-
-
-
-
-
-
- dispatch:function(event,dispose,args) {
- if (this.EVENT[event]) {
- var messages=this._queue[event];
- var size=messages.length;
- try {
- for (var i=0;i
- messages[i++].apply(messages[i++],messages[i++].concat(args || []));
- }
- } catch(e) {
- throw new Error(ERROR_LEVEL.DEBUG+e.message);
- } finally {
- if (dispose) {
- this._queue[event].clear();
- }
- }
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- },
-
-
-
-
-
-
-
- on:function(event,message,scope,args) {
- if (this.EVENT[event]) {
- if (this._queue[event].indexOf(message)==-1) {
- this._queue[event].push(message);
- this._queue[event].push(scope || window);
- this._queue[event].push(args || []);
- } else {
- throw new Error(ERRORS['EventQueue.ALEADY_EXIST']+':'+event);
- }
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- },
-
-
-
-
-
- un:function(event,message) {
- var index;
- if (this.EVENT[event] && (index=this._queue[event].indexOf(message))!=-1) {
- this._queue[event].deleteAt(index,3);
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- }
- });
- return constructor;
- })();
-
-
-
- jsLoader.MessageQueue=(function() {
- var constructor=function() {
- this._queue=[];
- this._listened=null;
- }
- Util.extend(constructor.prototype,{
-
-
-
- _listen:function() {
- var _this=this;
- if (this._listened) {
- if (this._queue.length==0) {
- setTimeout(function() {
- _this._listen()
- },500);
- } else {
- this.inform();
- }
- }
- },
-
-
-
- startListen:function() {
- this._listened=true;
- this._listen();
- },
-
-
-
- stopListen:function() {
- this._listened=false;
- },
-
-
-
- inform:function() {
- if (this._queue.length==0) {
- this._listen();
- return;
- } else {
- var message=this._queue.shift();
- var scope=this._queue.shift();
- var args=this._queue.shift();
- try {
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- sun2grit
- 等级: 初级会员
- 性别:
- 文章: 2
- 积分: 30
- 来自: 武汉
|
能举几个简单的调用示例吗?
|
返回顶楼 |
|
|
- brull
- 等级: 初级会员
- 性别:
- 文章: 20
- 积分: 50
- 来自: 成都
|
ajaxgo 写道 首先很感谢bingo,用非常新颖的思路,实现了这么一个js的loader工具。往外抛异常阻止函数运行,并在加载完后继续运行caller的做法,让人眼前一亮。不得不佩服js的世界是如此的奇妙。 在阅读bingo的js loader,获得启发的同时,也对其中的代码功能做了一些调整。例如,添加了绑定事件机制,可以预先绑定需要在加载(loaded)完后触发的操作(事件一共有5类)。规范了消息队列的实现,bingo的实现中,把消息队列耦合的太紧密。所以独立实现了一个消息队列,在loader中使用等等。整个代码经过重写,并加了注释,方便爱好者学习和探讨,也希望大家反馈bug。并且允许在include时,设置caller的scope和arguments,这样就可以在一般的函数中,比如实例方法(而不只是在匿名函数)使用include。因为,bingo的实现中,在调用caller时,只是简单的运行caller,如果在有需要作用域和需要参数传递的函数中,会失去原本的作用域和传递进来的参数。 最后,还是非常感谢bingo! 代码如下(代码下载在最后): js 代码 -
- var jsLoader=new function() {
-
-
-
- this.NAMESPACE_TYPE={
- CLASS:'class',
- INTERFACE:'interface',
- OBJECT:'object'
- };
- this.LOADMODE_TYPE={
- PACKAGE:'package',
- FILE:'file',
- DYNAMIC:'dynamic'
- };
- this.ERROR_LEVEL={
- INFO:'@jsadk:',
- DEBUG:'*@jsadk:',
- FATAL:'!*@jsadk:',
- THROWS:'^!*@jsadk:'
- };
- this.ERRORS={};
-
-
-
- var _this=this;
- var _version='1.0a';
- var _libPath='./';
- var _errLv=this.ERROR_LEVEL.FATAL;
- var _loadmode=this.LOADMODE_TYPE.PACKAGE;
- var _packages={};
-
-
-
- this.getVersion=function() {
- return _version;
- };
- this.getLibPath=function() {
- return _libPath;
- };
- this.setLibPath=function(libPath) {
- _libPath=libPath;
- };
- this.getLoadMode=function() {
- return _loadmode;
- };
- this.setLoadMode=function(loadmode) {
- _loadmode=loadmode;
-
- };
- this.getErrLevel=function() {
- return _errLv;
- }
- this.setErrLevel=function(level) {
- _errLv=level;
- };
-
-
-
-
-
-
-
-
- var _addPKGs=function(root,pks) {
- for (var pk in pks) {
- if (typeof pks[pk]=='string') {
- root[pk]=_this.Util.initVar(root[pk],pks[pk]);
- } else if(typeof pks[pk]=='object') {
- root[pk]=_this.Util.initVar(root[pk],{});
- _addPKGs(root[pk],pks[pk]);
- }
- }
- };
-
-
-
-
- this.getPKGs=function(pack) {
- return _this.Util.eval(pack,_packages);
- };
-
-
-
-
-
- this.regPKGs=function(pkgs,ns) {
- var size=arguments.length;
- var ns=ns.split('.');
- var root=_packages;
- for (var i=0;i
- root=root[ns[i]]=_this.Util.initVar(root[ns[i]],{});
- }
- _addPKGs(root,pkgs);
- };
-
-
-
- window.onerror=function() {
- if (arguments[0].indexOf(_errLv)>-1) {
- return false;
- } else {
- return true;
- }
- };
- };
-
- with(jsLoader) {
-
-
-
- jsLoader.Util={
-
-
-
- emptyFunction:function() {},
-
-
-
-
-
- eval:function(obj,scope) {
- scope=(scope==null)?window:scope;
- if (typeof obj=='string') {
- try {
- with(scope) {
- obj=eval(obj);
- }
- } catch (e) {
- return undefined;
- }
- }
- return obj;
- },
-
-
-
-
-
- exist:function(obj,scope) {
- return (typeof this.eval(obj,scope)=='undefined'?false:true);
- },
-
-
-
-
-
- initVar:function(obj,initVal) {
- if (typeof obj=='undefined') {
- obj=initVal;
- }
- return obj;
- },
-
-
-
-
-
-
-
-
- extend:function(destination,source,fProperty,fValue) {
- for (var property in source) {
- var _property=(fProperty || Util.emptyFunction).call(source,property,destination);
- if (_property!=false) {
- var _value=(fValue!=null?
- fValue.call(source,source[property],property,destination):
- source[property]);
- destination[typeof _property=='string'?_property:property]=_value;
- }
- }
- return destination;
- }
- };
-
-
-
- (function() {
- Util.extend(Array.prototype,{
- first:function() {
- return this[0];
- },
- last:function() {
- return this[this.length-1];
- },
-
-
-
-
-
- indexOf:function(element,struct) {
- var size=this.length;
- for (var i=0;i
- if ((struct && this[i]===element) ||
- (!struct && this[i]==element)) {
- break;
- }
- }
- return (i==size?-1:i);
- },
-
-
-
-
- insertAt:function(index) {
- var args=[index,0];
- var size=arguments.length;
- for (var i=1;i
- args.push(arguments[i]);
- }
- this.splice.apply(this,args);
- },
-
-
-
-
-
- deleteAt:function(index,size) {
- result=this.splice(index,size || 1);
- return result;
- },
-
-
-
- clear:function() {
- this.length=0;
- }
- });
- })();
-
-
-
- jsLoader.EventQueue=(function() {
- Util.extend(ERRORS,{
- 'EventQueue.NO_SUCH_EVENT':ERROR_LEVEL.DEBUG+'no such a event',
- 'EventQueue.ALEADY_EXIST':ERROR_LEVEL.DEBUG+'the message is already exsited!'
- });
- var constructor=function(event) {
- this._queue={};
- this.EVENT={};
- for (var e in event) {
- this.EVENT[event[e]]=true;
- this._queue[event[e]]=[];
- }
- };
- Util.extend(constructor.prototype,{
-
-
-
-
-
-
- dispatch:function(event,dispose,args) {
- if (this.EVENT[event]) {
- var messages=this._queue[event];
- var size=messages.length;
- try {
- for (var i=0;i
- messages[i++].apply(messages[i++],messages[i++].concat(args || []));
- }
- } catch(e) {
- throw new Error(ERROR_LEVEL.DEBUG+e.message);
- } finally {
- if (dispose) {
- this._queue[event].clear();
- }
- }
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- },
-
-
-
-
-
-
-
- on:function(event,message,scope,args) {
- if (this.EVENT[event]) {
- if (this._queue[event].indexOf(message)==-1) {
- this._queue[event].push(message);
- this._queue[event].push(scope || window);
- this._queue[event].push(args || []);
- } else {
- throw new Error(ERRORS['EventQueue.ALEADY_EXIST']+':'+event);
- }
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- },
-
-
-
-
-
- un:function(event,message) {
- var index;
- if (this.EVENT[event] && (index=this._queue[event].indexOf(message))!=-1) {
- this._queue[event].deleteAt(index,3);
- } else {
- throw new Error(ERRORS['EventQueue.NO_SUCH_EVENT']+':'+event);
- }
- }
- });
- return constructor;
- })();
-
-
-
- jsLoader.MessageQueue=(function() {
- var constructor=function() {
- this._queue=[];
- this._listened=null;
- }
- Util.extend(constructor.prototype,{
-
-
-
- _listen:function() {
- var _this=this;
- if (this._listened) {
- if (this._queue.length==0) {
- setTimeout(function() {
- _this._listen()
- },500);
- } else {
- this.inform();
- }
- }
- },
-
-
-
- startListen:function() {
- this._listened=true;
- this._listen();
- },
-
-
-
- stopListen:function() {
- this._listened=false;
- },
-
-
-
- inform:function() {
- if (this._queue.length==0) {
- this._listen();
- return;
- } else {
- var message=this._queue.shift();
- var scope=this._queue.shift();
- var args=this._queue.shift();
- try {
呵呵,原来在12月份就有这么个东西发布了呢,看样子不错,不过代码没仔细看。对于bingo我也很长时间没空去进一步完善了,希望来年来完善一下。冒味问下,你是与狼共舞?
|
返回顶楼 |
|
|
- ajaxgo
- 等级: 初级会员
- 性别:
- 文章: 155
- 积分: 70
- 来自: 珠海
|
sun2grit 写道 能举几个简单的调用示例吗?
下载的代码里面有示例
|
返回顶楼 |
|
|
- ajaxgo
- 等级: 初级会员
- 性别:
- 文章: 155
- 积分: 70
- 来自: 珠海
|
brull 写道 呵呵,原来在12月份就有这么个东西发布了呢,看样子不错,不过代码没仔细看。对于bingo我也很长时间没空去进一步完善了,希望来年来完善一下。冒味问下,你是与狼共舞? 我不是与狼共舞哦,呵呵,不好意思
|
返回顶楼 |
|
|
- brull
- 等级: 初级会员
- 性别:
- 文章: 20
- 积分: 50
- 来自: 成都
|
ajaxgo 写道 brull 写道 呵呵,原来在12月份就有这么个东西发布了呢,看样子不错,不过代码没仔细看。对于bingo我也很长时间没空去进一步完善了,希望来年来完善一下。冒味问下,你是与狼共舞? 我不是与狼共舞哦,呵呵,不好意思 那看来对这个东西感兴趣的人还是有一些的,我也感到比较欣慰,再接再厉
|
返回顶楼 |
|
|
- rain16881
- 等级: 初级会员
- 性别:
- 文章: 43
- 积分: 50
- 来自: 中山
|
有的ext desktop就有一个js加载顺序的问题.
希望能用你的js loader解决
|
返回顶楼 |
|
|
- rain16881
- 等级: 初级会员
- 性别:
- 文章: 43
- 积分: 50
- 来自: 中山
|
我用了之后是可以按自己想的顺序加载了..
不过.性能是一个好大的问题.
加上..我在js 的有调用的..一个也不要用.
|
返回顶楼 |
|
|