API(应用程序编程接口)
预先定义的函数
Web API
浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)
DOM(文档对象模型)
1. 什么是DOM
W3C推荐的处理可扩展标记语言(HTML或XML)的标准编程接口,通过DOM可以改变网页的内容、结构和样式
2. 获取元素
var timer = document.getElementById('time');
console.dir(timer);
var ol = document.getElementById('ol');
var lis = document.getElementsByTagName('li');
var boxs = document.getElementsByClassName('box');
var nav = document.querySelector('#nav');
var allBox = document.querySelectorAll('.box');
var bodyEle = document.body;
var htmlEle = document.documentElement;
3. 事件基础
var div = document.querySelector('div');
div.onclick = function() {
console.log('我被选中了');
}
4. 操作元素
常见元素属性修改
常见元素属性:innerHTML、innerText、src、href、id、src、href、alt、title
img.src = 'images/zxy.jpg';
img.title = '张学友思密达';
innerHTML和innerText
var div = document.querySelector('div');
div.innerText = '<strong>今天是:</strong> 2019';
div.innerHTML = '<strong>今天是:</strong> 2019';
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
表单属性设置以及this的使用
可以通过DOM改变以下的表单属性:type、value、checked、selected、disabled 表单的值是通过value 来改变,而不是innerHTML
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function() {
input.value = "输入";
btn.disabled = true;
this.disabled = true;
}
样式属性操作
操作style属性
this.style.backgroundColor = 'purple';
操作className属性
this.className = 'first change';
自定义属性
<div id="demo" index="1" class="nav"></div>
<script>
var div = document.querySelector('div');
console.log(div.id);
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
div.id = 'test';
div.className = 'navs';
div.setAttribute('index', 2);
div.setAttribute('class', 'footer');
div.removeAttribute('index');
</script>
H5自定义属性
- H5规定自定义属性
data- 开头做为属性名并且赋值。
<div data-index=“1”></div>
- 获取H5自定义属性
<div getTime="20" data-index="2" data-list-name="andy"></div>
<script>
var div = document.querySelector('div');
console.log(div.getAttribute('data-index'));
console.log(div.getAttribute('data-list-name'));
console.log(div.dataset);
console.log(div.dataset.index);
console.log(div.dataset['index']);
console.log(div.dataset.listName);
console.log(div.dataset['listName']);
</script>
5. 排他思想
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
for (var i = 0; i < btns.length; i++) {
btns[i].style.backgroundColor = '';
}
this.style.backgroundColor = 'pink';
}
}
6. 节点操作
利用父子兄节点关系获取元素, 逻辑性强, 但是兼容性稍差 标签、属性、文本、注释等 都是节点Node
节点基础
节点至少拥有nodeType(节点类型) 、nodeName(节点名称 )和nodeValue(节点值) 这三个 基本属性。 元素节点 nodeType 为 1 属性节点 nodeType 为 2 文本节点 nodeType 为 3 (文本节点包含文字、空格、换行等) 一般将把节点划分为不同的层级关系,常见的是父子兄 层级关系
获取父级节点
<div class="box">
<span class="erweima">×</span>
</div>
<script>
var erweima = document.querySelector('.erweima');
console.log(erweima.parentNode);
</script>
获取子节点
- parentNode.childNodes(标准)
但parentNode.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合,且返回值 里面包含了所有的子节点 ,包括元素节点 ,文本节点 , 如果只想要获得里面的元素节点,则需要专门处理,根据nodeType == 1 判断 - parentNode.children(非标准)
parentNode.children 是一个只读 属性,返回所有的子元素节点 。它只返回子元素节点 ,其余节点不返回,得到了各个浏览器的支持 ,重点掌握这个
<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<script>
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType);
console.log(ul.childNodes[1].nodeType);
console.log(ul.children);
</script>
获取第1个子节点
- parentNode.firstChild
返回第一个子节点,找不到则返回null。也是包含所有的节点 - parentNode.firstElementChild
返回第一个子元素节点,找不到则返回null。 但有兼容性问题,IE9 以上才支持 - parentNode.chilren[0]
获取最后1个子节点
- parentNode.lastChild
返回最后一个子节点,找不到则返回null。也是包含所有的节点 - parentNode.lastElementChild
返回最后一个子元素节点,找不到则返回null。 但有兼容性问题,IE9 以上才支持 - parentNode.chilren[parentNode.chilren.length - 1]
<ol>
<li>我是li1</li>
<li>我是li2</li>
<li>我是li3</li>
<li>我是li4</li>
<li>我是li5</li>
</ol>
<script>
var ol = document.querySelector('ol');
console.log(ol.firstChild);
console.log(ol.lastChild);
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
</script>
获取上一个兄弟节点
- node.previousSibling
返回当前元素的上一个兄弟元素节点,找不到则返回null。 也是包含所有的节点。 - node.previousElementSibling
返回当前元素上一个兄弟元素节点,找不到则返回null。 但有兼容性问题,IE9 以上才支持
获取下一个兄弟节点
- node.nextSibling
返回当前元素的下一个兄弟元素节点,找不到则返回null。 也是包含所有的节点。 - node.nextElementSibling
返回当前元素下一个兄弟元素节点,找不到则返回null。 但有兼容性问题,IE9 以上才支持
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
console.log(div.nextSibling);
console.log(div.previousSibling);
console.log(div.nextElementSibling);
console.log(div.previousElementSibling);
</script>
取消兼容性
function getNextElementSibling(element) {
var el = element;
while (el = el.nextSibling) {
if (el.nodeType === 1) {
return el;
}
}
return null;
}
创建节点
document.createElement()
添加节点
- node.appendChild(child)
将一个节点添加到指定父节点的子节点列表末尾 - node.insertBefore(child, 指定元素)
将一个节点添加到父节点的指定子节点前面
<ul>
<li>123</li>
</ul>
<script>
var li = document.createElement('li');
var ul = document.querySelector('ul');
ul.appendChild(li);
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
</script>
7. 经典案列
全选和取消全选案例
var j_cbAll = document.getElementById('j_cbAll');
var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');
j_cbAll.onclick = function() {
console.log(this.checked);
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].checked = this.checked;
}
}
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].onclick = function() {
var flag = true;
for (var i = 0; i < j_tbs.length; i++) {
if (!j_tbs[i].checked) {
flag = false;
break;
}
}
j_cbAll.checked = flag;
}
}
tab栏
var tab_list = document.querySelector('.tab_list');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item');
for (var i = 0; i < lis.length; i++) {
lis[i].setAttribute('index', i);
lis[i].onclick = function() {
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
this.className = 'current';
var index = this.getAttribute('index');
console.log(index);
for (var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
items[index].style.display = 'block';
}
}
下拉菜单
var nav = document.querySelector('.nav');
var lis = nav.children;
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function() {
this.children[1].style.display = 'block';
}
lis[i].onmouseout = function() {
this.children[1].style.display = 'none';
}
}
留言板
<body>
<textarea name="" id=""></textarea>
<button>发布</button>
<ul>
</ul>
<script>
var btn = document.querySelector('button');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function() {
if (text.value == '') {
alert('您没有输入内容');
return false;
} else {
var li = document.createElement('li');
li.innerHTML = text.value;
ul.insertBefore(li, ul.children[0]);
}
}
</script>
</body>
|