dojo教程之一:Hello Dojo

异步模块定义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内容的加载,这是一个良好的习惯,也是我们应该遵循的编码规范。

你可能感兴趣的:(dojo)