JavaScript 内容总结(JavaScript高级程序设计)
1.DOM简介
- 编程接口:处理网页的结构 样式 内容
- DOM树
- 文档:一个页面就是一个文档,DOM中使用document表示
- 元素:页面中的所有标签都是元素,DOM中使用element表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示
- DOM把以上内容都看作是对象
2.获取元素
-
根据ID获取
<body> <div id="time">2101-8-9</div> <script> var time = document.getElementById('time'); console.dir(time); </script> </body>
-
根据标签名获取 返回对象集合 以伪数组形式存储
<body> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> <script> var li = document.getElementsByTagName('li'); console.log(li); for (let i = 0; i < li.length; i++) { console.log(li[i]); } // 获取父元素内部所有制定标签名的子元素 //父元素必须是单个对象(必须指明是哪个元素对象) var ul = document.getElementsByTagName('ul')[0] console.log(ul.getElementsByTagName('li')); </script> </body>
-
通过HTML5新增的方法获取
-
通过类名获取:根据类名返回元素对象集合
<body> <div class="box1"></div> <div class="box1"></div> <script> var box = document.getElementsByClassName('box1'); console.log(box); </script> </body>
-
querySelector:根据指定选择器返回第一个元素对象
<body> <div class="box1"></div> <div id="box1"></div> <ul> <li>1</li> <li>2</li> </ul> <script> var box = document.querySelector('.box1'); var box1 = document.querySelector('#box1'); var li = document.querySelector('li'); console.log(li);//<li>1</li> </script> </body>
-
querySelectorAll:根据指定选择器返回所有元素对象
<body> <div class="box1"></div> <div class="box1"></div> <script> var box = document.querySelectorAll('.box1'); console.log(box);//伪数组 </script> </body>
-
-
特殊元素获取(body、html)
<body> <script> var box = document.body;//获取body var box1 = document.documentElement;//获取html元素对象 console.log(box); console.log(box1); </script> </body>
3.事件基础
-
事件三要素(事件源 事件类型 事件处理程序)
<body> <button id="btn">唐伯虎</button> <script> var btn = document.getElementById('btn');//事件源 //事件类型 onclick btn.onclick = function () {//事件处理程序 alert('点秋香'); } </script> </body>
4.操作元素
-
改变元素内容
- element.innerHTML:从起始位置到终止位置的内容,识别html标签,同时保留空格和换行(推荐)
- element.innerText:从起始位置到终止位置的内容,不识别html标签,同时空格和换行也会去掉
-
改变元素属性
-
element.src .href .id .alt .title
<body> <img src="./images/erweima.png" alt="" class="img"> <script> // var img = document.getElementsByClassName('img')[0] // var img = document.getElementsByTagName('img')[0] // var img = document.getElementById('img') var img = document.querySelector('img') // var img = document.querySelector('.img') // var img = document.querySelector('#img') console.log(img); img.onclick = function () { console.log(11); img.src = './images/miaosha.png' } </script> </body>
-
-
表单元素的属性操作 (type、value、checked、selected、disabled)
用法同上
-
改变css样式
<style> div { width: 200px; height: 200px; background-color: red; } </style> </head> <body> <div></div> <script> var div = document.querySelector('div'); div.onclick = function () { div.style.backgroundColor = 'purple';//变成行内样式 div.style.width = '300px'; } </script> </body>
-
排他思想
如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:
-
所有元素全部清除样式(干掉其他人)
-
给当前元素设置样式(留下我自己)
-
注意顺序不能颠倒
//tab切换 var tabtitle = document.getElementsByClassName('tabtitle')[0].children[0].children; var content = document.getElementsByClassName('tabcontent_main'); for (let i = 0; i < tabtitle.length; i++) { tabtitle[i].setAttribute('data-index', i);//自定义属性 tabtitle[i].onclick = function () { //干掉其他人 for (let i = 0; i < tabtitle.length; i++) { tabtitle[i].className = ''; } for (let i = 0; i < content.length; i++) { content[i].style.display = 'none'; } //留下我自己 this.className = 'tabtitle_first'; var index = this.getAttribute('data-index'); content[index].style.display = 'block'; } }
-
-
自定义属性操作
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中;
-
设置自定义属性:H5规定自定义属性data-开头作为属性名并且赋值;
-
dataset:包含所有以data开头的自定义属性;
比如 < div data-index=‘1’ >< /div >
-
获取属性值
-
element.属性名; ------自带
-
element.getAttribute(‘属性名’);-------自定义
-
element.dataset.设置自定义属性时data-后面的名;
-
element.dataset[‘设置自定义属性时data-后面的名’]
<div data-index='1' data-list-index='1' ></div> div.dataset.index div.dataset.listIndex //注意驼峰命名法
-
-
设置属性值
- element.属性名=’’; ------自带
- element.setAttribute(‘属性名’,‘属性值’); -------自定义
-
移除属性
- removeAttribute(‘属性名’)
-
tabtitle[i].setAttribute('data-index', i);//自定义属性
var index = this.getAttribute('data-index');
content[index].style.display = 'block';
5.节点操作
-
利用父子兄级获取元素
-
获取父级节点:parentNode 只能得到离他最近的父节点 没有则返回null
<body> <div class="grandparent"> <div class="parent"> <div class="son"> </div> </div> </div> <script> var son = document.querySelector('.son'); console.log(son.parentNode);//<div class="parent"> </script> </body>
-
获取子级节点:childNodes 包含元素节点 文本节点 不推荐使用
-
获取子级节点:children 包含元素节点 推荐使用
<body> <ul> <li>01</li> <li>02</li> <li>03</li> <li>04</li> </ul> <script> var ul = document.querySelector('ul'); console.log(ul.children); console.log(ul.children[0]); console.log(ul.children[ul.children.length - 1]); console.log(ul.firstChild); console.log(ul.firstElementChild); </script> </body>
-
下拉菜单例子
.ul { margin-left: 20px; } .ul>li { float: left; width: 200px; } .ul>li>ul { display: none; } </style> </head> <body> <ul class="ul"> <li><a href="#">手机</a> <ul> <li><a href="#">xiaomi</a></li> <li><a href="#">huawei</a></li> <li><a href="#">hongmi</a></li> </ul> </li> <li><a href="#">电脑</a> <ul> <li><a href="#">daiwe</a></li> <li><a href="#">lianxing</a></li> <li><a href="#">heihei</a></li> </ul> </li> <li><a href="#">家具</a> <ul> <li><a href="#">hongm</a></li> <li><a href="#">l</a></li> <li><a href="#">hei</a></li> </ul> </li> </ul> <script> var ul = document.querySelector('.ul') for (let i = 0; i < ul.children.length; i++) { ul.children[i].onmouseover = function () { ul.children[i].children[1].style.display = 'block'; } ul.children[i].onmouseout = function () { ul.children[i].children[1].style.display = 'none'; } } </script> </body>
-
获取兄弟级节点:nextSibling 包含元素节点 文本节点 不推荐使用 下一个兄弟
previousSibling 包含元素节点 文本节点 不推荐使用 上一个兄弟
nextElementSibling 包含元素节点 找不到返回null 推荐 使用 下一个兄弟
previousElementSibling 包含元素节点 找不到返回null 推荐 使用 上一个兄弟
<body> <div>1</div> <span>2</span> <script> var div = document.querySelector('div'); console.log(div.nextSibling);//#text " console.log(div.previousSibling);//#text " console.log(div.nextElementSibling);//<span> </script> </body> <!--鉴于previousElementSibling 、nextElementSibling有兼容性,可以如下封装函数 -->
-
创建节点
var li = document.createElement('li');
-
添加节点 :父节点.appendChild(子节点);添加到原有元素的后面
父节点.insertBefore(子节点,指定元素);添加到原有元素的前面
<body> <div>1</div> <script> var div = document.querySelector('div'); var span = document.createElement('span'); var label = document.createElement('label'); div.appendChild(span); div.insertBefore(label,span); </script> </body>
-
简单版发布留言案例
<style> li { background-color: aqua; } </style> </head> <body> <textarea name="" id="" cols="30" rows="10"></textarea> <button>确定</button> <ul> <li>精彩评论</li> </ul> <script> var textarea = document.querySelector('textarea'); var button = document.querySelector('button'); var li = document.querySelector('li'); var ul = document.querySelector('ul'); button.onclick = function () { if (textarea.value == '') { alert('请输入评论内容'); } else { var lili = document.createElement('li'); lili.innerHTML = textarea.value; //ul.appendChild(lili); ul.insertBefore(lili, ul.children[1]); } } </script> </body>
-
删除节点:父节点.removeChild(子节点) 返回删除的节点
<style> li { background-color: aqua; width: 200px; height: 30px; margin-top: 20px; line-height: 30px; } li a { float: right; } </style> </head> <body> <textarea name="" id="" cols="30" rows="10"></textarea> <button>确定</button> <ul> <li>精彩评论</li> </ul> <script> var textarea = document.querySelector('textarea'); var button = document.querySelector('button'); var li = document.querySelector('li'); var ul = document.querySelector('ul'); button.onclick = function () { if (textarea.value == '') { alert('请输入评论内容'); } else { //(1)创建元素 var lili = document.createElement('li'); lili.innerHTML = textarea.value + "<a href='javascript:;'>删除</a>"; //ul.appendChild(lili); //(2)添加元素 ul.insertBefore(lili, ul.children[1]); //(3)删除元素 var a = document.querySelectorAll('a'); for (let i = 0; i < a.length; i++) { a[i].onclick = function () { ul.removeChild(this.parentNode); } } } } </script> </body>
-
克隆节点:父节点.cloneNode()
//括号为空或者里面是false 浅拷贝 只复制标签不复制里面内容
//括号为true 深拷贝 复制标签和里面内容
<body> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> <script> var ul = document.querySelector('ul'); //括号为空或者里面是false 浅拷贝 只复制标签不复制里面内容 //括号为true 深拷贝 复制标签和里面内容 var lili = ul.children[0].cloneNode(true); ul.appendChild(lili) </script> </body>
-
动态生成表格
<style> table { border-collapse: collapse; width: 500px; height: 30px; } table tr th { border: 1px solid red; background-color: slategrey; } table tr td { border: 1px solid red; text-align: center; } </style> </head> <body> <table> <tr> <th>姓名</th> <th>学科</th> <th>分数</th> <th>操作</th> </tr> </table> <script> var datas = [{ name: '魏璎珞', subject: 'javaScript', score: 100 }, { name: '弘历', subject: 'javaScript', score: 98 }, { name: '傅亨', subject: 'javaScript', score: 67 }] var table = document.querySelector('table'); for (let i = 0; i < datas.length; i++) { var tr = document.createElement('tr'); table.appendChild(tr); for (const j in datas[i]) { var td = document.createElement('td'); td.innerHTML = datas[i][j] tr.appendChild(td); } var td = document.createElement('td'); td.innerHTML = "<a href='javascript:;'>删除</a>"; tr.appendChild(td); } var a = document.querySelectorAll('a'); for (let i = 0; i < a.length; i++) { a[i].onclick = function () { table.removeChild(this.parentNode.parentNode) } } </script> </body>
-
三种动态创建元素区别
- document.write(‘标签’):直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
- document.innerHTML=“标签”:将内容写入某个DOM节点,创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
- document.createElement(‘标签名’):创建多个元素效率稍微低一些,但结构更清晰
<body> <div></div> <script> var div = document.querySelector('div'); //1. document.write('<span>didi</span>'); var span = document.querySelector('span'); var arr = []; for (let i = 0; i <= 100; i++) { //2.数组形式拼接效率高 arr.push("<label>baidu</label>"); div.innerHTML = arr.join(''); //div.innerHTML += "<label>baidu</label>" //3. var label = document.createElement('label') span.appendChild(label) } </script> </body>