异步模块定义AMD( Asynchronous Module Definition)
dojo1.7版本之后使用异步模块定义(AMD),使用dojo时只需引入dojo.js,用到特定模块时再进行异步引入。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello Dojo</title> <script src="dojo/dojo.js" data-dojo-config="async: true"></script> </head> <body> </body> </html>
dojo.js至提供核心功能,那么加载dojo.js后有哪些是可用的功能?首先AMD加载器可用,另外提供两个全局函数require和define。
require提供模块的异步加载功能,define用于自定义模块的定义。
dom基本操作
研究dojo之前,最好先下载dojo的源码,测试html放在源码目录
dojoroot/ --------/dojo --------/dijit --------/dojox --------/util --------/test.html
dojo/dom、dojo/dom-construct两个模块提供了dom节点的基本操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello Dojo</title> </head> <body> <h1 id="greeting">hello</h1> <script src="dojo/dojo.js" data-dojo-config="async: true"></script> <script type="text/javascript"> require(["dojo/dom", "dojo/dom-construct"],function(dom,domConstruct){ var greeting = dom.byId("greeting"); domConstruct.place("<i>Dojo!</i>",greeting); }); </script> </body> </html>
上面例子中使用require异步引入dom,dom-construct两个模块。javascript中的异步是通过回调函数实现的。
require方法中第一个参数是需要引入的模块id,第二个参数是回调函数,模块引入后会执行回调函数,回调函数的参数是引入模块的名称,顺序与模块数组一致,参数名可以任意取,但最好与模块id一致。
AMD自动加载依赖
使用dojo模块时,模块可能还需要其他模块,但我们不需要担心这些传递依赖,AMD会自动加载传递依赖,因此只要引入我们需要的模块。
定义模块
下面自定义一个模块,用于实现控件内容的存取和读取。
myModule.js是自定义的模块,与text.html同一路径
define(["dojo/dom"],function(dom){ var oldText = {}; return { setText:function(id,text){ var node = dom.byId(id); oldText = node.innerHTML; node.innerHTML = text; }, restoreText:function(id){ var node = dom.byId(id); node.innerHTML = oldText; } } })
text.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello Dojo</title> </head> <body> <h1 id="greeting">hello</h1> <button type="button" id="myButton">button</button> <script src="dojo/dojo.js" data-dojo-config="async: true"></script> <script type="text/javascript"> require(["myModule","dojo/on","dojo/dom"],function(myModule,on,dom){ myModule.setText("greeting","new text");//设置内容,并保存原内容 //on用于绑定dom节点与事件,后续会讲到 on(dom.byId("myButton"),"click",function(){ myModule.restoreText("greeting");//读取原内容 }); }); </script> </body> </html>
waiting for the dom
对dom节点的操作必须在dom节点加载之后才能执行,这一点是应该牢记的,dojo使用插件(plugin)实现等待dom节点加载,dojo提供多种plugin,domReady是其中一种,它用于等待dom节点的加载完成。
使用dojo提供的plugin时,只需要在require部分提供plugin的id,并在id后加上“!”
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello Dojo</title> </head> <body> <h1 id="greeting">hello</h1> <script src="dojo/dojo.js" data-dojo-config="async: true"></script> <script type="text/javascript"> require(["dojo/dom","dojo/domReady!"],function(dom){ dom.byId("greeting").innerHTML = "new text"; }); </script> </body> </html>
我们在上面的例子中没有使用domReady是因为script代码放在了body节点内部的下方,这样做的目的是js代码的加载不会影响body内容的加载,这是一个良好的习惯,也是我们应该遵循的编码规范。