1、前言
ArcGIS API for JavaScript
是基于Dojo
框架编写的开发包,因此了解并掌握Dojo
的相关基础知识是极为必要的。很多开发者都反馈过一个问题,那就是一看见ArcGIS API for JavaScript
里那些奇形怪状的代码就觉得无从下手。有一点必须得承认:Dojo
与现在流行的React
、Vue
相比,其设计思想确实已经落伍了,但这并不妨碍Dojo
仍旧是一个优秀的JavaScript
框架,其严格的模块化和面向对象的思想也依旧值得开发者学习借鉴。下面就来介绍一下Dojo
中的基础的dom
操作。
2、dojo/dom模块
在原生JavaScript
中,我们可以通过document.getElementById
方法获取对应的dom
元素。而在dojo
中,内置的dom
模块提供了一个byId
方法,我们可以通过该方法来获取对应的dom
元素,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<h1 id="title1">这是标题1</h1>
<h1 id="title2">这是标题2</h1>
<h1 id="title3">这是标题3</h1>
<script>
require(['dojo/dom', 'dojo/domReady!'], function (dom) {
var title1 = dom.byId('title1').innerText;
var title2 = dom.byId('title2').innerText;
var title3 = dom.byId('title3').innerText;
console.log(title1);
console.log(title2);
console.log(title3);
});
</script>
</body>
</html>
运行结果如下:
这是标题1
这是标题2
这是标题3
3、dojo/dom-construct模块
3.1、创建元素——create
Dojo
中内置的dom-construct
模块可用于创建dom
元素,该模块中包含一个create
方法,该方法的第一个参数为html
中的元素标签,如h1
、p
、li
等等。第二个参数为标签的属性值,第三个参数为父节点dom元素,第四个参数为在父节点中的插入位置。下面代码演示了在一个div
中创建三个h1
标签
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<div id="container">
</div>
<script>
require(['dojo/dom', 'dojo/dom-construct', 'dojo/domReady!'], function (dom, domConstruct) {
var container = dom.byId('container');
domConstruct.create('h1', { id: 'title1', innerHTML: '这是标题1' }, container, 'last');
domConstruct.create('h1', { id: 'title2', innerHTML: '这是标题2' }, container, 'last');
domConstruct.create('h1', { id: 'title3', innerHTML: '这是标题3' }, container, 'last');
});
</script>
</body>
</html>
运行结果如下图所示:
3.2、销毁元素——destroy
dom-construct
模块中的destroy
方法可用于销毁dom
元素,该方法会连同内部的dom
子节点一同销毁。下面代码演示了销毁div
的操作,由于调用了destroy
方法,因此div
内部的h1
元素也会一同被销毁。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<div id="container">
<h1 id="title1">这是标题1</h1>
<h1 id="title2">这是标题2</h1>
<h1 id="title3">这是标题3</h1>
</div>
<script>
require(['dojo/dom', 'dojo/dom-construct', 'dojo/domReady!'], function (dom, domConstruct) {
var container = dom.byId('container');
domConstruct.destroy(container);
});
</script>
</body>
</html>
运行结果如下图所示,可以发现整个div
元素都被销毁了。
3.3、清空元素——empty
dom-construct
模块中的empty
方法可用于清除内部元素。与destroy
方法不同,empty
方法只会清除内部的dom
子节点,父节点则不受影响。代码如下
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<div id="container">
<h1 id="title1">这是标题1</h1>
<h1 id="title2">这是标题2</h1>
<h1 id="title3">这是标题3</h1>
</div>
<script>
require(['dojo/dom', 'dojo/dom-construct', 'dojo/domReady!'], function (dom, domConstruct) {
var container = dom.byId('container');
domConstruct.empty(container);
});
</script>
</body>
</html>
运行结果如下图所示,可以发现:empty
方法并没有清除div
元素,只是将div
内部的h1
元素清除了。
3.4、插入元素——place
dojo/dom-construct
模块中的place
方法可用于插入dom
元素。该方法与create
方法类似,一共包含三个参数,第一个参数为插入的元素,第二个参数为父节点元素,第三个参数为插入的位置,如first
、last
。下面代码演示了在div
中插入h1
元素:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<div id="container">
</div>
<script>
require(['dojo/dom', 'dojo/dom-construct', 'dojo/domReady!'], function (dom, domConstruct) {
var container = dom.byId('container');
var title1 = domConstruct.create('h1', { innerHTML: '这是标题1' });
var title2 = domConstruct.create('h1', { innerHTML: '这是标题2' });
var title3 = domConstruct.create('h1', { innerHTML: '这是标题3' });
domConstruct.place(title1, container, 'last');
domConstruct.place(title2, container, 'last');
domConstruct.place(title3, container, 'last');
});
</script>
</body>
</html>
运行结果如下图所示:
4、dojo/dom-prop模块
4.1、get
dojo/dom-prop
模块提供了get
方法用来获取dom
元素的property
。下面代码演示了获取一个文本框的property
。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<input id="userName" type="text" placeholder="请输入用户名" value="admin" />
<script>
require(['dojo/dom', 'dojo/dom-prop', 'dojo/domReady!'], function (dom, domProp) {
var input = dom.byId('userName');
console.log(domProp.get(input, 'id'));
console.log(domProp.get(input, 'type'));
console.log(domProp.get(input, 'placeholder'));
console.log(domProp.get(input, 'value'));
});
</script>
</body>
</html>
运行结果如下所示:
userName
text
请输入用户名
admin
4.2、set
dojo/dom-prop
模块提供了set
方法用来设置dom
元素的property
。下面代码演示了将文本框变为密码框的操作。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<input id="userName" type="text" placeholder="请输入用户名" value="admin" />
<script>
require(['dojo/dom', 'dojo/dom-prop', 'dojo/domReady!'], function (dom, domProp) {
var input = dom.byId('userName');
// set
domProp.set(input, 'id', 'password');
domProp.set(input, 'type', 'password');
domProp.set(input, 'placeholder', '请输入密码');
domProp.set(input, 'value', '123456');
// get
console.log(domProp.get(input, 'id'));
console.log(domProp.get(input, 'type'));
console.log(domProp.get(input, 'placeholder'));
console.log(domProp.get(input, 'value'));
});
</script>
</body>
</html>
运行结果如下所示:
password
password
请输入密码
123456
5、dojo/dom-attr模块
5.1、get
dojo/dom-attr
模块中的get
方法可以用来获取dom
元素的属性值,下面代码演示了获取一个超链接属性的操作:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<a id="hyperLink" href="http://www.baidu.com" target="_blank">百度链接</a>
<script>
require(['dojo/dom', 'dojo/dom-attr', 'dojo/domReady!'], function (dom, domAttr) {
var link = dom.byId('hyperLink');
console.log(domAttr.get(link, 'id'));
console.log(domAttr.get(link, 'href'));
console.log(domAttr.get(link, 'target'));
console.log(domAttr.get(link, 'innerHTML'));
});
</script>
</body>
</html>
运行结果如下所示:
hyperLink
http://www.baidu.com
_blank
百度链接
5.2、set
dojo/dom-attr
模块中的set
方法可以用来设置dom
元素的属性值,下面代码演示了将百度链接改为网易链接的操作:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<a id="hyperLink" href="http://www.baidu.com" target="_blank">百度链接</a>
<script>
require(['dojo/dom', 'dojo/dom-attr', 'dojo/domReady!'], function (dom, domAttr) {
var link = dom.byId('hyperLink');
// set
domAttr.set(link, 'href', 'https://www.163.com');
domAttr.set(link, 'target', '_self');
domAttr.set(link, 'innerHTML', '网易链接');
// get
console.log(domAttr.get(link, 'id'));
console.log(domAttr.get(link, 'href'));
console.log(domAttr.get(link, 'target'));
console.log(domAttr.get(link, 'innerHTML'));
});
</script>
</body>
</html>
运行结果如下所示:
hyperLink
https://www.163.com
_self
网易链接
5.3、has
dojo/dom-attr
模块中的has
方法可以用来判断dom
元素是否包含某个属性值,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<a id="hyperLink" href="http://www.baidu.com">百度链接</a>
<script>
require(['dojo/dom', 'dojo/dom-attr', 'dojo/domReady!'], function (dom, domAttr) {
var link = dom.byId('hyperLink');
console.log('是否包含id属性:' + domAttr.has(link, 'id'));
console.log('是否包含href属性:' + domAttr.has(link, 'href'));
console.log('是否包含target属性:' + domAttr.has(link, 'target'));
console.log('是否包含style属性:' + domAttr.has(link, 'style'));
});
</script>
</body>
</html>
运行结果如下所示:
是否包含id属性:true
是否包含href属性:true
是否包含target属性:false
是否包含style属性:false
5.4、remove
dojo/dom-attr
模块中的remove
方法可以用来移除dom
元素中的某个属性值,下面代码演示了移除超链接中的href
属性:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>demo</title>
<script src="http://localhost/arcgis_js_api/library/4.15/dojo/dojo.js"></script>
</head>
<body>
<a id="hyperLink" href="http://www.baidu.com" target="_blank">百度链接</a>
<script>
require(['dojo/dom', 'dojo/dom-attr', 'dojo/domReady!'], function (dom, domAttr) {
var link = dom.byId('hyperLink');
domAttr.remove(link, 'href');
});
</script>
</body>
</html>
运行程序可以发现,由于href
属性被移除,因此点击超链接没有反应。
6、结语
本文介绍了Dojo
中基础的dom
操作方法,主要涉及到dojo/dom
、dojo/dom-construct
、dojo/dom-prop
、dojo/dom-attr
等内置模块。只要熟悉了Dojo
的模块化思想,你会发现它其实并不难,甚至很多思想值得去借鉴并应用。