回顾:
1.获取
document.getElementById
document.getElementsByTagName
document.getElementsByClassName
document.querySelector
document.querySelectorAll
document.body
document.head
document.all
document.documentElement
2.offset
offsetLeft
offsetTop
offsetWidth
offsetHeight
offsetParent
3.scroll
scrollTop
scrollLeft
scrollWidth
scrollHeight
4.client
clientLeft
clientTop
clientWidth
clientHeight
5.JS 的组成 DOM BOM ECMAScript
6.DOM document object model 文档对象模型
DOM document object model 文档对象模型可以使JS具有操作页面元素的能力
DOM的顶层对象是document。
JS的顶层对象是Object。
BOM的顶层对象是window
7. 兼容性
高级浏览器FF 99% Chrome,苹果 80% IE 678 60%
8.DOM节点
节点是一个宽泛的概念,里面不只是只有HTML元素,元素只是其中的一部分。
HTML标签 元素节点
text 文本节点 ; innerText内容中所有的文本节点
eg: innerText内容中所有的文本节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<input type="text" value="dshad">
<ul>
<li>snbdf</li>
<li>asdn</li>
<li>sidzdu</li>
</ul>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
console.log(div.innerText); // innerText内容中所有的文本节点
</script>
</body>
</html>
9.节点的类型 不同类型的节点nodeType的值不一样。比如元素节点的nodeType是1
文本节点的元素类型是3.
http://www.w3school.com.cn/jsref/prop_node_nodetype.asp
- childNodes:获取所有的子节点。
- children :获取所有的子元素。
- parentNode:获取父节点。
-
offsetParent:获取定位父级。
eg:获取子节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</body>
<script>
var ul = document.querySelector('ul');
// console.log(ul.firstChild);
// console.log(ul.firstElementChild);
//兼容
var child = ul.firstElementChild?ul.firstElementChild:ul.firstChild;
console.log(child)
</script>
</html>
10.获取首尾节点
-
firstChild:IE678获取的是第一个元素节点,高级浏览器获取的是第一个节点
(可能是文本节点)。 - lastChild :同上,获取的是最后一个节点。
-
firstElementChild:IE678不支持,高级浏览器获取的是第一个元素节点。
兼容的写法:
var child = ul.firstElementChild?ul.firstElementChild:ul.firstChild;
function getFirstChild(obj){
return obj.firstElementChild?obj.firstElementChild:obj.firstChild;
}
- lastElementChild :同上,获取的是最后一个节点。
-
nextSibling:IE678获取的是下一个兄弟元素节点,高级浏览器获取的是下一个节点
(可能是文本节点)。 - nextElementSibling:IE678不支持,高级浏览器获取的是下一个兄弟元素节点。
-
previousSibling、previousElementSibling: 获取上一个兄弟节点
eg:兄弟节点的操作(获取的内容是元素内容的下一个元素)
兄弟节点的操作.jpg
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div class="big">
<div id="d1"></div>
<div id="d2"></div>
<div id="d3"></div>
</div>
</body>
<script>
var d2 = document.getElementById('d2');
console.log(d2.nextSibling);
console.log(d2.nextElementSibling);
</script>
</html>
11.元素属性的DOM操作方式
获取:getAttribute(名称)
设置:setAttribute(名称, 值)
删除:removeAttribute(名称)
eg:DOM操作(每过一秒钟,里面的值加一)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="text" id="tet" value="123">
</body>
<script>
var text = document.querySelector('input');
//每过一秒钟,里面的值加一
var val = text.getAttribute('value'); //getAttribute (获取) text.getAttribute(在text中继续获取)
var timer = setInterval(function(){
text.setAttribute('value',++val);
},1000);
text.removeAttribute('id');
</script>
</html>
12.元素操作
createElement 创建一个标签
appendChild 在某一个标签的最后添加子元素
insertBefore(新节点,标识节点)。在标识节点之前插入一个节点
扩展:一般页面dom操作添加的元素的操作步骤?
- 创建
- 添加属性
- 插入
removeChild : 删除一个子节点。
replaceChild:(新节点,旧节点) 替换子节点、
node.cloneNode(bool):节点克隆;
true: 复制节点中的内容,包括子节点
false:只是赋值节点本身。
document.createDocumentFragment(): 创建文档碎片。方便DOM操作。
-
文档碎片:类似一个临时的文档,将所有要加的dom元素先放在这里,达到不要每次操作dom元素提高页面效率
eg:
4.jpg
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
img{
width:100px;
}
</style>
</head>
<body>
</body>
<script>
console.time('abc');
var img = document.createElement('img');
img.src = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539752642719&di=4313282824eb1828aa48494f3c1b3433&imgtype=0&src=http%3A%2F%2Fpic24.photophoto.cn%2F20120723%2F0033034314132137_b.jpg';
var sp = document.createDocumentFragment();
for(var i =0;i<5000;i++){
var imgsrc = img.cloneNode(true);
sp.appendChild(imgsrc);
}
document.body.appendChild(sp);
console.timeEnd('abc');
</script>
</html>
13.js运行时间检查
console.time();
console.timeEnd();
参数是这个时间计时的名称。
14.表格操作
tHead 获取表格的thead分组
tFoot 获取表格的tfoot分组
tBodies 获取表格的tbody分组(结果是数组)
rows 获取分组里面所有的行(tr)
cells 获取某行的所有(td)
eg:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<table border="1" width="400">
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tfoot>
<tr>
<td>3.33</td>
<td>4.44</td>
<td>5.55</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>
</body>
<script>
var tb = document.getElementsByTagName('table')[0];
console.log(tb.tBodies[0].rows[1].cells);
</script>
</html>
15.表单操作
- 获取表单
form.name
form.elements
获取控件的值
eg:form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="1.asp" method="post">
<input type="text" name="user_name" placeholder="请输入用户名"><br><br>
<input type="password" name="password" placeholder="请输入密码"><br><br>
<input type="submit"><br><br>
</form>
</body>
<script>
var form = document.getElementsByTagName('form')[0];
form.user_name.onchange = function(){
alert(1)
};
form.onsubmit = function(){
return false;
};
</script>
</html>
-
表单事件
change
focus
blur
input
submit
示例:模拟手机短信发送
3.jpg
3.1.jpg
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模拟短信发送</title>
<style>
#container {
height: 620px;
width: 300px;
background: url("mobile.png") no-repeat center center;
margin: auto;
position: relative;
}
#content {
height: 375px;
width: 236px;
position: absolute;
top: 100px;
left: 32px;
overflow: scroll;
}
#footer {
margin: 0;
position: absolute;
left: 32px;
bottom: 100px;
background: #eee;
border-top: 1px solid gray;
border-bottom: 1px solid gray;
width: 236px;
text-align: center;
display: inline;
line-height: 39px;
}
#avatar {
width: 24px;
height: 24px;
border: 1px solid gray;
border-radius: 5px;
padding: 2px;
vertical-align: middle;
cursor: pointer;
}
#message {
height: 23px;
width: 140px;
font-size: 12px;
vertical-align: middle;
}
#send {
border: 1px solid gray;
padding: 5px;
vertical-align: middle;
border-radius: 5px;
font-size: 14px;
color: gray;
text-decoration: none;
cursor: pointer;
}
#content p {
margin: 2px;
}
#content span {
font-size: 14px;
display: inline-block;
padding: 5px;
border: 1px solid gray;
border-radius: 5px;
margin: 3px;
max-width: 160px;
vertical-align: top;
word-wrap: break-word;
}
#content img {
height: 24px;
width: 24px;
border: 1px solid gray;
border-radius: 5px;
padding: 2px;
margin: 3px;
vertical-align: top;
}
.text-right{
text-align: right;
}
.text-right span{
background: #eee;
}
.text-left{
text-align: left;
}
.text-left span{
background: green;
}
</style>
</head>
<body>
<div id="container">
<div id="content">
<p class="text-right">
<span >小猪说</span>
<img src="expression1.png">
</p>
<p class="text-left">
<img src="expression2.jpg">
<span >小孩说</span>
</p>
</div>
<p id="footer">
<img id="avatar" src="expression1.png">
<input id="message" type="text" placeholder="选头像、输文字、点发送">
<a id="send" href="javascript:">发送</a>
</p>
</div>
</body>
<script>
function $(selector){
return document.querySelector(selector)};
var type=true;
var head = $('#avatar');
// 猪头与小孩头像的转换
head.onclick = function(){
if(type){
head.src='expression2.jpg';
}else{
head.src='expression1.png';
}
type = !type; //整个效果去反
};
// 发送
$('#send').onclick=function(){
if(!$('#message').value){
return flase;
}
var p = document.createElement('p');
var img = document.createElement('img');
var span = document.createElement('span'); //获取底部输入框的所以标签
span.innerText = $('#message').value; //设置获取的所有span的文本内容
if(!type){
p.className='text-left';
img.src='expression2.jpg';
p.appendChild(img);
p.appendChild(span);
}else{
p.className='text-right';
img.src='expression1.png';
p.appendChild(img);
p.appendChild(span);
}
$('#content').appendChild(p);
$('#message').value = '';
};
</script>
</html>