对象 - Dom元素对象 ¶
作者:KK
发表日期:2016.2.19
Dom元素简单地说就是标签元素,HTML代码中的标签是可以进行程序操作的,操作之前就需要先将它转化成JS对象来调用一些方法或者属性进行操作
其实前面介绍document对象已经初步演示了一下,我这里正式讲解
假设文档中有一个id="xxx"
的标签时,使用document.getElementById('xxx')
就可以得到这个对象,比如:
<script>
var xxxDiv = document.getElementById('xxx');
alert(xxxDiv); //会提示一个字符串说明这是一个什么对象
xxxDiv.innerHTML = '修改的内容';
</script>
<div id="xxx">原始内容</div>
<button onclick="test()" type="button">操作标签元素</button>
而为了证明它是一个对象,你可以试下alert(typeof(div))
看看它的变量类型,绝对不是string类型(字符串)和number类型(数字)
不存在时会返回null值 ¶
如果传递一个不存在的id给getElementById方法则会查找不到对象,会返回null
值:
testId = 'xxx222';
var xxxDiv2 = document.getElementById(testId); //修改下这个ID参数
if(xxxDiv == null){
alert(testId + ' 这个ID的标签元素不存在!');
}else{
alert(testId + ' 这个ID是存在的!');
}
然后通常新手会遇到这种问题,因为他们学的教程可能没提到这个问题或者没注意到,下面代码就是取得了一个null值
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>注意文档加载顺序</title>
<script type="text/javascript">
var contentDiv = document.getElementById('content');
alert(contentDiv); //null
contentDiv.innerHTML = '修改后的内容'; //这句代码会执行失败,因为contentDiv不是一个对象,而是null
</script>
</head>
<body>
<div id="content">原始内容</div>
</body>
</html>
原因是文档加载顺序,之前介绍事件时已经略有提到过,浏览器对网页代码是从上到下加载的,所以运行上面那段JS代码的时候,下面body都还没出生呢,更别说#content啦
解决办法就是在页面加载完成之后才执行你的代码,以现在所学到的知识,应该先将代码放在一个函数里,然后body的onload属性执行这个函数即可,例子:
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>注意文档加载顺序</title>
<script type="text/javascript">
function modifyContent(){
var contentDiv = document.getElementById('content');
alert(contentDiv); //object HtmlDivElement
contentDiv.innerHTML = '修改后的内容';
}
</script>
</head>
<body onload="modifyContent()"><!--重点是这个onload属性执行函数-->
<div id="content">原始内容</div>
</body>
</html>
后面还有很多对元素操作的演示代码,你复制我的代码到文件中进行测试时,注意要在onload之后执行,不然只会得不到对象而无法操作的哦
不过其实只要被操作的目标元素"出生了"就可以了是不是?告诉你哦,你只要把script标签放到要操作的标签后面就可以了
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>注意文档加载顺序</title>
</head>
<body onload="modifyContent()"><!--重点是这个onload属性执行函数-->
<div id="content">原始内容</div>
<p>中间插个p标签</p>
<!--我上面加个p标签是为了证明这个script标签只要放在#content后面任何位置就行,不是要紧跟着#content-->
<script type="text/javascript">
var contentDiv = document.getElementById('content');
alert(contentDiv); //object HtmlDivElement
contentDiv.innerHTML = '修改后的内容';
</script>
</body>
</html>
标签有很多,元素对象也有很多 ¶
不是所有标签都是同一种元素对象来的
<script> function test(){ var div = document.getElementById('div'); alert(div); //显示 object HtmlDivElement var a = document.getElementById('link'); alert(a); //直接显示网址 var img = document.getElementById('img'); alert(img); //显示 object HtmlImageElement } </script> <button onclick="test()">点我测试</button> <div id="div">div的内容</div> <a id="link" href="http://www.kkh86.com/it/index.html">野生程序员学习大纲</a> <img id="img" src="/it/face/cahan.gif"/>
并且不同的元素对象也有不同的属性
<script> function test(){ var div = document.getElementById('div'); alert('尝试访问div.value属性,结果是:' + div.value); var input = document.getElementById('age'); alert('尝试访问input.value属性,结果是:' + input.value); //结果是18,说明访问value属性成功,也就是标签上的value属性 input.value = 99; //此时标签上显示的数字也变成了这个值 var img = document.getElementById('img'); alert(img.src); //就是标签的src属性值 img.src = 'http://www.kkh86.com/it/face/cahan.gif'; } </script> <button onclick="test()">点我测试</button> <div id="div" value="333">div的内容</div> <img id="img" src="http://www.kkh86.com/it/face/jingkong.gif"/> <input id="age" value="18" />
所以,访问元素对象的属性之前要先看看你这个是什么元素的对象,如果是div就不会有value属性了,并且你在div里加value属性也是没用的,比如
<div id="div" value="333">div的内容</div>
,那么访问div.value
是还是undefined,因为在HTML标准的规定中,div就是没有value的,除非你用点别的手段去实现
元素可以通过其它方式获取,不一定要document.getElementById
,这个后面我们学了数组之后再告诉你~
通过JS来创建元素并添加到文档中 ¶
var link = document.createElement('a'); //创建一个标签元素对象,这个参数字符串 a 就是标签名称,表示创建a标签
link.href = 'http://www.kkh86.com/it/index.html'; //设置链接地址
link.innerHTML = '野生程序员的成长之路'; //设置链接文字
//调用document.body的appendChild方法来将这个链接添加到文档流中,还记得CSS样式知识中提到的"文档流"吗?
document.body.appendChild(link);
也就是说,本来只是一个内存变量var link = ...
,但是通过appendChild将它从内存添加到了浏览器窗口的HTML文档元素中,进入了页面