【dojo】dojo.ready(dojo.addOnLoad) “前传”
最近的项目中使用了dojo框架,每个页面中大量使用了 dojo.ready 来完成页面初始化的工作。但因为某种原因,需要在所有的 dojo.ready 之前做一些事。
对于 dojo 1.6 以前(包括1.6) 来说,这稍微有点麻烦。看源码:
[csharp] view plaincopy
dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
d._onto(d._loaders, obj, functionName);
if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
d._callLoaded();
}
}
真正执行初始化方法的是 dojo.loaded:
[csharp] view plaincopy
dojo.loaded = function(){
d._loadNotifying = true;
d._postLoad = true;
var mll = d._loaders;
//Clear listeners so new ones can be added
//For other xdomain package loads after the initial load.
d._loaders = [];
for(var x = 0; x < mll.length; x++){
mll[x]();
}
d._loadNotifying = false;
if(d._postLoad && d._inFlightCount == 0 && mll.length){
d._callLoaded();
}
}
通过 dojo.ready(addOnLoad) 加入的 function, 都保存在 dojo._loaders 的数组中。
那么,只好重写 loaded 方法了:
[csharp] view plaincopy
dojo._inits = [];
dojo.addInit = function(obj) {
dojo._inits.push(obj);
};
dojo.loaded = function(){
var d = dojo;
d._loadNotifying = true;
d._postLoad = true;
var mll = [];
for(var i=0; i<d._loaders.length; i++) {
console.log(d._loaders[i]);
mll.push(d._loaders[i]);
if (d._loaders[i].toString().indexOf('registerWin') > -1)
for(var j=0; j<d._inits.length; j++)
mll.push(d._inits[j]);
}
}
d._loaders = [];
d._inits = [];
for(var x = 0; x < mll.length; x++){
mll[x]();
}
d._loadNotifying = false;
if(d._postLoad && d._inFlightCount == 0 && mll.length){
d._callLoaded();
}
}
我在 dojo 中加入了 _inits 数组,保存通过 addInit 注册的方法。然后检查所有通过 dojo.ready / addOnLoad 加入的方法,在dijit 完成注册(这时候 dojo parse 已经结束)后,把 _inits 里的方法插入。这样我就可以通过 dojo.addInit 在框架中加入一些处理,让它们始终在 dojo.ready / addOnLoad 加入的方法之前被执行。
测试:
[javascript] view plaincopy
dojo.ready(function() { console.log(1); });
dojo.ready(function() { console.log(2); });
dojo.addInit(function() { console.log('init'); });
结果:
[html] view plaincopy
日志: init
日志: 1
日志: 2
从 dojo 1.7 开始,dojo.js 就大部分重写了。 dojo.ready 的接口也变了:
[csharp] view plaincopy
var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback)
加入了 priority 优先级参数,上面的实现可以大大简化。当默认通过 dojo.ready(function() {...}) 加入的方法,默认的 priority = 1000。
这样下面的代码就可以轻松搞定:
[csharp] view plaincopy
dojo.addInit = function(obj) { dojo.ready(1, obj); };
分享到:
相关推荐
dojo.js 1.4.2dojo.js 1.4.2dojo.js 1.4.2dojo.js 1.4.2dojo.js 1.4.2dojo.js 1.4.2dojo.js 1.4.2
dojo.js.uncompressed.js 1.4.2dojo.js.uncompressed.js 1.4.2dojo.js.uncompressed.js 1.4.2
它提供了一系列的函数,如`dojo.xhrGet`、`dojo.xhrPost`等,用于向服务器发送异步请求,获取或发送数据,从而实现页面无刷新的数据交互。 3. **dojo的模块系统**:dojo的基础是它的模块系统,它使用了AMD规范来...
**DOJO.js 框架详解** DOJO.js 是一个功能强大的JavaScript库,它被誉为“最优秀的js框架”之一,特别是在版本1.9.3中,这个称号得到了充分的体现。DOJO以其全面的特性、模块化的设计以及对各种浏览器的良好支持而...
dojo.xd.js 最新JavaScript框架组件!
dojo.js
【Dojo.GUI_v6.zip for pencil】是一款专为Pencil设计的GUI模板资源包,它扩展了Pencil这款优秀的Web原型设计工具的功能和视觉元素。Pencil是一个免费且开源的应用程序,允许用户创建各种交互式原型,适用于网页、...
1. **Dojo基础**:首先,读者会了解到Dojo的核心概念,如dojo.js加载器、dojo.declare用于类定义、dojo.connect用于事件处理,以及dojo.query用于DOM查询。这些基础知识是理解Dojo工作的关键。 2. **模块系统(AMD...
dojo.js.uncompressed.js 1.92版
domino xapges 其中的dojo.xhrGet 和 dojo.xhrPost例子
dojo.js.核心jsDojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库
2. 引入Dojo核心库:通过`<script>`标签引入`dojo.js`,这是Dojo的基础文件,可能已经包含了部分常用模块。 3. 声明需要使用的模块:使用`dojo.require()`来引入所需的包或模块,确保它们在运行时可用。 Dojo为了...
难得纯净资源,不用下载其他乱起八糟的东西了
Dojo的核心特性之一是它的模块化系统,通过`dojo.require`和`dojo.provide`来组织和加载代码,使得代码更易于管理和维护。这允许开发者按需加载特定功能,减少页面加载时间。 3. **Dojo Toolkit组件** - **dojo....
dojo.ready(function(){ // 在这里放置你的代码,这部分代码将在页面DOM元素加载完成后执行 }); ``` #### 2. 元素的获取 - **`dojo.query`**:这是一个类似于jQuery的选择器方法,可以根据CSS选择器来获取页面中...
在上述代码中,`dojo.addOnLoad` 接收一个回调函数作为参数,在页面加载完成后执行该回调函数。 #### 五、DOM 事件监听:`dojo.connect` 除了页面加载事件,Dojo 还提供了 `dojo.connect` 方法用于绑定 DOM 事件。...
dojo核心文件,一款很好用的javascript库文件
Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...
当需要处理复杂的跨域场景,如上传文件或处理需要维持会话的请求时,Dojo的`dojo.io.iframe`模块提供了利用隐藏IFrame进行AJAX通信的解决方案。 总结来说,"dojo-0.3.1-ajax"是Dojo工具包的一个版本,专注于提供...
Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...