JavaScript

DOM

​ DOM,全称Document Object Model文档对象模型。

​ JS中通过DOM来对HTML文档进行操作


节点 Node——构成HTML文档最基本的单元。常用节点分为四类

  1. 文档节点:整个HTML文档 。文档节点document,代表的是整个HTML文 档

  2. 元素节点:HTML文档中的HTML标签 。 HTML中的各种标签都是元素节点。浏览器会将页面中所 有的标签都转换为一个元素节点, 我们可以通过document的方法来获取元素节点。

  3. 属性节点:元素的属性 。表示的是标签中的的属 性,

    ​ 注意:①属性节点并非元素节点的子节点,而是元素节点的一部分。

    ​ ②一般不使用属性节点。

  4. 文本节点:HTML标签中的文本内容 。是元素节点的子节点 ;包括纯文本内容、一堆空格 。

window.onload = function(){}

该函数写在head标签的script内,意思是页面加载完毕后才加载script的这些事件

若script写在body标签内,则写在最后


获取元素节点

1.getElementById() – 通过id属性获取一个元素节点对象
var btn01 = document.getElementById("btn01");
			btn01.onclick = function () {
				var bj = document.getElementById("bj")
				alert(bj.innerHTML)
			};
2.getElementsByTagName() – 通过标签名获取一组元素节点对象
var btn02 = document.getElementById("btn02");
			btn02.onclick = function () {
				var lis = document.getElementsByTagName("li");
				for (var i = 0; i < lis.length; i++) {
					alert(lis[i].innerHTML);
				}
			};
3.getElementsByName() – 通过name属性获取一组元素节点对象
var btn03 = document.getElementById("btn03");
			btn03.onclick = function () {
				var names = document.getElementsByName("gender");
				for (var n = 0; n < names.length; n++) {
					alert(names[n].value);
				}

			};

获取元素子节点

  1. getElementsByTagName()**方法,**返回当前节点的指定标签名后代节点
//查找#city下所有li节点
			var btn04 = document.getElementById("btn04");
			btn04.onclick = function () {
				var city = document.getElementById("city");
				var cli = city.getElementsByTagName("li");
				for (var i = 0; i < cli.length; i++) {
					alert(cli[i].innerHTML);
				}
			};
  1. childNodes 属性,表示当前节点的所有子节点
    但把文本节点也算进去(ie8以上不会算),用.children属性可解决(ie均兼容)
    //返回#city的所有子节点
    			//获取按钮这个事件
    			var btn05 = document.getElementById("btn05");
    			//为按钮绑定一个点击事件
    			btn05.onclick = function () {
    				//获取id为city节点
    				var cities = document.getElementById("city");
    				//查找#city下所有li节点
    				// var cns = cities.childNodes;
    				//其中把文本也算进去了,比如标签间的空格、提行,共9个
    				var cns = cities.children;//其中只有标签元素的数量,4个
    				alert(cns.length);
    
    			}
    
  2. firstChild 属性,表示当前节点的第一个子节点
    也会将文本算进去,用.firstElementChild(不兼容ie8以上)
    var btn06=document.getElementById("btn06");
    			btn06.onclick=function(){
    				var phone=document.getElementById("phone");
    				// var firNode=phone.firstChild;    //获取当前元素的第一个子节点
    				var firNode=phone.firstElementChild;//获取当前元素的第一个子元素,避免识别空格。但不兼容ie8以上
    				alert(firNode.innerHTML)
    			}
    
  3. lastChild 属性,表示当前节点的最后一个子节

图片切换练习95

思路、难点:

​ 1.设置div、img、button的样式[^ (img的样式要在其他样式的上面)]

​ 2.绑定button的点击事件

​ 3.将所有图片的src放在一个数组里

(因为getElementsByTagName返回的是数组,但我们需要数组里面的元素,且这里只有一种元素,故要用【0】将其取出 。则:var img = document.getElementsByTagName(“img”)[0]😉
	4.通过调用数组里的元素 i,改变当前图片的路径

​ 5.通过 i的值来中在文字表示当前是第几张图[^ 注意 i 的取值]


98表单的全选练习——爱好的运动

包括,全选、全不选、反选、提交这四个按钮

以及,四种球类运动的复选框、一个全选/全不选复选框。繁琐,难度不大

难点:1.反选按钮的优化
2.全选/全不选,受其余四个复选框的影响。则全选/全不选的按钮,先为这四个绑定点击事件,再在每个点击事件判断其它三个按钮的勾选情况



101DOM的剩余方法

1.getElementsByClassName()

可以根据class属性值获取一组元素节点对象, 但是该方法不支持IE8及以下的浏览器

2.document.querySelector()

​ * - 需要一个选择器的字符串作为参数,可以根据一个CSS选择器来查询一个元素节点对象

​ * - 虽然IE8中没有getElementsByClassName()但是可以使用querySelector()代替

​ * - 使用该方法总会返回唯一的一个元素,如果满足条件的元素有多个,那么它只会返回第一个

3.document.querySelectorAll()

​ * - 该方法和querySelector()用法类似,不同的是它会将符合条件的元素封装到一个数组中返回

​ * - 即使符合条件的元素只有一个,它也会返回数组


102.DOM的增删——最喜欢的城市

1.document.createElement 添加新的元素
2.document.createTextNode 添加新的文本节点
3.appendChild() 向父节点中添加一个新的子节点

​ 用法:父节点.appendChild(子节点)

4.insertBefore() 在指定的子节点前插入新的子节点

​ 用法:父节点.insertBefore(新节点,旧节点)

5.replaceChild() 用新的子节点替换已有的子节点

​ 语法:父节点.replaceChild(新节点,旧节点);

6.removeChild() 删除一个子节点

​ 语法:父节点.removeChild(子节点);

​ 子节点.parentNode.removeChild(子节点)

7.使用innerHTML也可以完成DOM的增删改的相关操作 ,一般我们会两种方式结合使用 。如:
var li=document.createElement("li");
                    li.innerHTML="广州";
                    city.appendChild(li);



103.添加删除记录——表格内删除员工

1.this 在点击函数里,this指的就是该函数
for (var i = 0; i < allA.length; i++) {
                allA[i].onclick = function () {
                ///
                    var deleteTr = this.parentNode.parentNode;
               ///
                    var deleteName = deleteTr.children[0].innerHTML;

                    var flag = confirm("确认删除" + deleteName + "吗?");
                    if (flag) {
                        deleteTr.parentNode.removeChild(deleteTr);
                    }

                    return false;
其中this,不能用allA [ i ]来替代,因为fro循环会在页面加载完成后立马执行,但响应函数是在被点击后才执行。当响应函数执行时,for循环早已执行完毕。
2. confirm() 弹出带有一段信息和确认按钮、取消按钮的弹窗 (括号内写确认信息的文字)
3.通过在响应函数的最后return false;来取消超链接的默认行为

(点击超链接,会跳转页面,是超链接的默认行为 。)


103.添加删除记录——表格内添加员工

思路

1.为提交按钮绑定点击函数

2.获取输入的name、email、salary内的value值

3.在表格里添加一个tr、四个td节点;三个text文本节点、a元素节点和a的text节点,并组合到tr中

(在td节点中添加a元素,并设置的href,再添加文字delete)

4.将获取到的四个信息添加到新的td中

5.为新的节点重新再绑定一个删除响应函数

6.将两个删除响应函数简化成一个

思路优化

1.为提交按钮绑定点击函数

2.获取输入的name、email、salary内的value值

3.创建一个tr节点,直接为tr写入内容

 //直接为tr写入内容
                tr.innerHTML="<td>"+name+"</td>"+
                                "<td>"+email+"</td>"+
                                "<td>"+salary+"</td>"+
                                "<td><a href='#'>Delete</a></td>";

4.为新增的a绑定点击函数

5.为新来的aHref信息设置delete的点击函数


107.使用DOM操作CSS的内联样式

通过JS修改元素的样式

1.语法: 修改:元素.style.样式名 = 样式值 读取:元素.style.样式名
2.注意:
1)样式值要用引号引起来 如box1.style.height=“100px”;
2)JS修改、读取的样式是内联样式,修改时优先级高于样式表的样式 (样式表就是head里面的style )
3)如果CSS的样式名中含有 -

​ 这种名称在JS中是不合法的比如background-color

​ 需要将这种样式名修改为驼峰命名法,

​ 去掉-,然后将-后的字母大写 ,如backgroundColor

4)如果在样式表中写了 !important

​ 如:background-color: #DE1E26 !important;

​ 则此时样式会有最高的优先级,即使通过JS也不能覆盖该样式,此时将会导致JS修改样式失效

​ 尽量不要为样式添加!important

通过JS获取当前元素的样式

以下两种方法均只读
1.currentStyle

​ 1)只支持IE浏览器,其他的浏览器都不支持

​ 2)语法:元素.currentStyle.样式名

​ 如:alert(box1.currentStyle.width);

​ 3)若未设置width,则返回auto

2.getComputedStyle()方法

​ 1) 不支持IE8及以下

​ 2) 语法:这个方法是window的方法,可以直接使用

getComputedStyle(参数1,参数2),需要两个参数

​ 第一个:要获取样式的元素名称

​ 第二个:可以传递一个伪元素,一般都传null

​ 3)若未设置width,则返回浏览器此时浏览到的长度

​ 4)该方法会返回一个对象,对象中封装了当前元素对应的样式,可以通过对象.样式名来读取样式

​ 如:alert(getComputedStyle(box1,null).width);

3.定义一个函数,同时兼容IE和其它浏览器

​ 则要注意 要获取的样式需用【】括起来

//定义一个函数来获取指定元素当前的样式 
//obj 要获取样式的元素  theName 要获取的样式
  		function getStyle(obj, theName) {
// var theStyle=getComputedStyle(obj,null).[theName];
// return theStyle;
//return obj.currentStyle[theName];
	/***********同时兼容IE和其它浏览器*******************/
              if (window.getComputedStyle) {
                    return getComputedStyle(obj,null)[theName];
                }
                else {
                    return obj.currentStyle[theName];
                }
            }
       //return obj.currentStyle[theName];
}



110.其它样式操作(都是只读,不可修改)

具体操作

1.clientWidth、clientHeight

​ 1.获取元素的可见宽度和高度,包括内容区和内边距和滚动条
2.不带px的,返回都是一个数字,可以直接进行计算

2.offsetWidth、offsetHeight: 获取元素的整个的宽度和高度,包括内容区、内边距和边框

offsetLeft 、offsetTop : 获取元素相对于其定位父元素的水平偏移量 垂直偏移量

offsetParent : 获取当前元素的定位父元素

​ 即离当前元素最近、开启了定位的祖先元素,若无祖先元素开启定位,则返回body

3.scrollWidth、scrollHeight 获取元素整个滚动区域的宽度和高度

scrollLeft 、scrollTop 可以获取水平滚动条滚动的距离 、垂直滚动条滚动的距离

4.当满足scrollHeight - scrollTop == clientHeight 说明垂直滚动条滚动到底了

(scrollHeight - scrollTop - clientHeight )

满足scrollWidth - scrollLeft == clientWidth 说明水平滚动条滚动到底

注意:

<div id="div3">
        <div id="div4"></div>
</div>

1.对div3设置overflow:auto才会有滚动框

2.对div3调用上面的方法才可以

3.scrollTop是小数,且会比实际小一点,导致scrollHeight - scrollTop > clientHeight,则可以用
scrollHeight - scrollTop - clientHeight < 1 来解决

练习——滚动条到底才可以勾选选框

box1.onscroll=function(){
                if (box1.scrollHeight - box1.scrollTop - box1.clientHeight < 1) {
                    input[0].disabled = false;
                    input[1].disabled = false;
                } 
                else {
                    input[0].disabled = true;
                    input[1].disabled = true;
                }
            }

1.其中onscroll事件,是在滚动条被移动时,才会触发

2.要先在input标签中,设置disabl=“disable”(或者等于true)才可以


112.Div跟随鼠标移动

显示鼠标的坐标

areaDiv.onmousemove = function(event){
			/** 在IE8中,响应函数被触发时,浏览器不会传递事件对象,
			  * 在IE8及以下的浏览器中,是将事件对象作为window对象的属性保存*/
			  
			/*if(!event){
				event = window.event;
			}*/
			
			//解决事件对象的兼容性问题
			event = event || window.event;
			
			/** clientX可以获取鼠标指针的水平坐标
			 * cilentY可以获取鼠标指针的垂直坐标*/
			var x = event.clientX;
			var y = event.clientY;
			
			//在showMsg中显示鼠标的坐标
			showMsg.innerHTML = "x = "+x + " , y = "+y;
};
1.clientX和cilentY——>用于获取鼠标在当前的可见窗口的水平坐标、垂直坐标

语法:var x = event.clientX

2.在IE8及以下中,响应函数被触发时,浏览器不会传递事件对象,将事件对象作为window对象的属性保存
3.onmousemove 鼠标移动事件

​ * - 该事件将会在鼠标在元素中移动时被触发


div跟随鼠标

window.onload = function(){
				var box1 = document.getElementById("box1");
				//绑定鼠标移动事件
				document.onmousemove = function(event){
				//解决兼容问题
				event = event || window.event;
				
				//获取滚动条滚动的距离
/*这句话并不正确“chrome认为浏览器的滚动条是body的,可用body.scrollTop获取”
通过实践操作,发现document.documentElement.scrollTop均兼容
 *火狐、ie等浏览器认为浏览器的滚动条是html的*/
var st = document.body.scrollTop || document.documentElement.scrollTop;
var sl = document.body.scrollLeft || document.documentElement.scrollLeft;
				
				//获取到鼠标的坐标  //pageX和pageY
				var left = event.clientX;
				var top = event.clientY;
				
				//设置div的偏移量
				box1.style.left = left + sl + "px";
				box1.style.top = top + st + "px";
				}

1.鼠标的坐标是以body的左上角为零点。

div的坐标是以当前屏幕的左上角为零点

2.开启box1的绝对定位

​ position: absolute;

3.“chrome认为浏览器的滚动条是body的,可用body.scrollTop获取”这句话并不正确
通过实践操作,发现document.documentElement.scrollTop均兼容

4.要给body加一个长宽,才会有滚动条

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值