DOM


typora-root-url: images
typora-copy-images-to: images

总结

BOM对象模型

window 子对象 document location(location.href location.reload ) history

window下的方法 alert() prompt cconfirm() open()

DOM 文档对象模型

根节点 html 子节点 body head 兄弟节点 父级节点

js中获取节点: getElementById() 返回节点

getElementsByClassName() 返回节点数组

getElementsByTagName() 返回节点数组

getElementsByName( ) 返回节点数组

querySelector() 返回节点

querySelectorAll() 返回节点数组

滚动条事件

onscroll 检测滚动条变化

document.documentElement.scrollTop  滚动条高度获取

document.documentElement.scrollLeft  滚动条距离左侧的距离获取

onresize 检测窗口大小的改变

第一节

DOM属性的基本操作

属性的定义
什么是元素的属性?class就是元素的属性,写在元素内的所有东西都是元素的属性,比如link的href,img的src等

元素的属性是什么,分为两种,一种叫内置属性,一种叫非内置属性。
内置属性的操作
    innerHTML/innerText  //返回值是当前元素的内容
    id                    //返回值是当前元素的ID
    title                 //获取title的标签值,这个title是从document中获取的
    className             //返回值是当前元素的class
    href                  //返回值是当前的href的值
    以上这些属性既可以获取,也可以设置

例1:获取下列表单的节点的各种值,并且进行修改

      <div id="box" class="first" feng="admin">123</div>
		<a href="lunaxiede" title="这是a" target="_blank">zheshia</a>
		<img src="asd/asd/asdasdsa.jpg" alt="这是img的alt" title="这是图片"/>
		<input type="text" name="user" id="user" value="" />

js获取节点的写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
        <div id="box" class="first" feng="admin">123</div>
		<a href="http://www.edrc.cn" title="这是a" target="_blank">zheshia</a>
		<img src="asd/asd/asdasdsa.jpg" alt="这是img的alt" title="这是图片"/>
        <input  type="text" name="user" id="user" value="默认值" />
<script>
    // 内置属性的获取
    // 获取节点
    //  var divObj = document.getElementById('box');
    // // console.log(divObj);
    //  // 获取节点的id
    //  console.log(divObj.id);
    //  // 获取class名称
    //  console.log(divObj.className);
    //  //修改class的名称
    //  divObj.className = 'one';
    //  // 修改id的名称
    //  divObj.id = 'poem';

     // a标签属性的获取
    //  var aObj = document.getElementsByTagName('a')[0];
    // // console.log(aObj);
    //   // 获取href属性
    //   console.log(aObj.href);
    //   //获取title
    //   console.log(aObj.title);
    //   console.log(aObj.target);
    //   // 获取a的文本内容
    //   console.log(aObj.innerHTML);
    //   console.log(aObj.innerText);
    //   // 修改a标签文本内容
    //  // aObj.innerHTML='<p>众生嚷嚷,皆为利来</p>';
    
    //   aObj.innerText='<p>众生嚷嚷,皆为利来</p>';  // 不能追加html标签

    // 图片标签属性的获取
    // var imgObj = document.getElementsByTagName('img')[0];
    //   //  console.log(imgObj.src);
    //     imgObj.src='./6.jpg';
    //     imgObj.width = 100;

    // input的操作
    var inputObj = document.getElementById('user');
        console.log(inputObj.value);
        // 获取标签名称
        console.log(inputObj.tagName);
        // 标签名称是不允许改的
        inputObj.tagName= 'iiii';
       
// value和innerHTML的区别
// value属性:  input框
//  innerHTML: 标签中包含的文本内容和标签
</script>
</body>
</html>

以上属性因为是标签固有的,所以可以直接使"."的方式调用.

非内置属性(自定义属性)

getAttribute(name)

描述:获取指定对象的属性名的属性值

返回:属性值

     console.log(obox.feng)   // 获取不到值
	 console.log(obox.getAttribute("feng"))

setAttribute(name,value)

描述:给指定对象设置属性名和属性值

参数:name指属性名,value指属性值

例如:divObj.setAttribute(‘one’,1);

   		obox.setAttribute("a","110")
		obox.setAttribute("feng","root")

removeAttribute(name):

描述:移除指定对象的属性

obox.removeAttribute("a")

例1:移除p中自定义的属性

<p goodsId='25'>因噎废食 </p>
节点公共的属性

[外链图片转存失败(img-WvCUVcG8-1567240552413)(/1564713467244.png)]

 父节点.firstChild:返回第一个子节点,包含空白节点(文本节点)
       .firstElementChild:返回第一个子节点
 父节点.lastChild:返回最后一个子节点(包含空白)
        lastElementChild  返回最后一个子节点(不包含空白)
nextSibling属性返回元素节点之后的兄弟节点(包括文本节点、注释节点即回车、换行、空格、文本等等)

nextElementSibling属性只返回元素节点之后的兄弟元素节点(不包括文本节点、注释节点)(IE7/8不支持)

previousSibling 属性返回元素节点之前的兄弟节点(包括文本节点、注释节点);
previousElementSibling 属性只返回元素节点之前的兄弟元素节点(不包括文本节点、注释节点),只读属性;(IE7/8不支持)
childNodes:返回子节点列表(包括,文本节点,注释节点),返回时一个组数
children: 只返回元素节点

节点

parentNode:返回父节点

其他

nodeName:返回节点名字
nodeValue:返回节点值 (针对文本节点)

例1:获取suga文本节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
       <ul>
               <li>noodlle</li>
               <li>fish</li>
               <li>sugar</li>
        </ul>

        <script>
           // document 表示文档本身
          // console.log(document);
           // 获取第一个子节点
         //  console.log(document.firstChild);
                 // 获取最后一个子节点
           var htmlObj  = document.lastChild;
          // console.log(htmlObj);
           
           // 获取body节点
           var bodyObj = htmlObj.lastChild;
        //   console.log(bodyObj);

           // 获取ul节点
           var ulObj = bodyObj.firstChild;
            // console.log(ulObj);  // 会获取空白节点
           // 使用不包好空白节点的获取方法
            var ulObj1 = bodyObj.firstElementChild;
              console.log(ulObj1);

           //获取ul中的最后一个li
           var liObj = ulObj1.lastElementChild;
             // console.log(liObj);
            
              // 返回节点名字
             // console.log(liObj.nodeName);
           // 获取最后一个li中文本节点
           var textObj = liObj.firstChild;
           //  console.log(textObj);
            
            // 返回节点的值
         //  console.log(textObj.nodeValue);
            // 修改最后li中的内容,就是修改文本节点值
            textObj.nodeValue = '赳赳老秦,共赴国难';

         // ul兄弟节点的操作
         var broObj =ulObj1.nextSibling; //包含空白节点
         var broObj1  = ulObj1.nextElementSibling;
         console.log(broObj);
         console.log(broObj1);

         // ul的父级节点
         var bodyObj1 = ulObj1.parentNode;
         console.log(bodyObj1);
        </script>
</body>
</html>

练习

隔行变色

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			.active{
			    background: #ccc;
			}
		</style>
	</head>
	<body>
		<ul>
			<li>link1</li>
			<li>link2</li>
			<li>link3</li>
			<li>link4</li>
			<li>link5</li>
		</ul>
	</body>
	<script type="text/javascript">
		var ali = document.querySelectorAll("li")
		
		for(var i=0;i<ali.length;i++){
			if(i%2 == 0){
				ali[i].className = "active";
			}
		}
		
	</script>
</html>

进度条

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box{
                width: 400px;
                height: 300px;
                position: relative;
                border: solid 1px black;
                margin: 50px auto;
			}
			.bar{
                width: 0px;
                height: 30px;
                background: green;
                border-radius: 6px;
                position: absolute;
                top: 135px;
                line-height: 30px;
                text-align: center;
                color: #fff;
			}
		</style>
	</head>
	<body>
		<div id="box">
			<div class="bar">
				<span>0%</span>
			</div>
		</div>
	</body>
	<script type="text/javascript">
		var obar = document.querySelector(".bar")
		var ospan = document.querySelector("span")
		var w = 0;
		var timer;
		var speed = 7;		//步长
		var target = 400;	//目标
		
		timer = setInterval(function(){
			if(w >= target){
//			if(target - w < speed){
				clearInterval(timer)
				w = 400;
				
				alert("BOOM")
				
			}else{
				w = w + speed;
			}
			ospan.innerHTML = parseInt((w/target)*100) + "%"
			obar.style.width = w + "px";
		},30)
		
		
	</script>
</html>

第三节

节点的增删改查
节点创建

元素节点:document.createElement(tag标签名称);

文本节点:document.createTextNode(文本内容);

属性设置:node.setAttribute(名称,值);

节点追加

父节点.appendChild(子节点); // 向父节点添加最后一个子节点

父节点.insertBefore(newnode,oldnode); // 将newnode放到oldnode的前边

节点删除

父节点.removeChild(子节点);

父节点.remove();

实现对元素的增删改查

<body>
		<span>这是一个span</span>
		<ul id="list">
			<li>link1</li>
			<li>link2</li>
			<li>link3</li>
		</ul>
	</body>
	<script type="text/javascript">
//		元素节点的增删改查
		
//		增
		var div = document.createElement("div")
		console.log(div)
		
		document.body.appendChild(div)
		
		div.innerHTML = "hahahaha"
		
		div.className = "box";
		
//		删
//		div.remove()
		var ospan = document.querySelector("span")
//		ospan.remove()
		
		var olist = document.getElementById("list")
		var oli2 = olist.children[1]
//		oli2.remove()
		olist.removeChild(oli2)
		
//		改
		console.log(ospan.outerHTML)
		ospan.outerHTML = "<em>" + ospan.innerHTML + "</em>";
	</script>
CSS DOM(扩展)

功能:使js可以动态给HTML添加css样式属性 (行内样式)

语法:对象名.style.CSS属性转化为js后的名称 = 属性值;

例如:

color:red;

obj.style.color = ‘red’;

obj.style.background = ‘red url()’

obj.style.fontSize = ;

【CSS属性转化为js后的名称规则】

1、一个单词直接写,如:color,background,margin,width,height
2、多个单词,第二个单词去掉“-”并且“首字母大写”:

font-size => fontSize

font-family => fontFamily

border-width => borderWidth

案例:点击改变盒子的样式和内容

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
         #box{
             width: 200px;
             height: 200px;
          
             background-color: pink;
         }
    </style>
</head>
<body>
	
    <div id="box">内容部分</div>
    
    <button id="btn1">改变宽度</button>
    <button id="btn2">改变高度</button>
    <button id="btn3">改变颜色</button>
    <button id="btn4">改变内容</button>

	<script>
     // 1 获取节点
     var btn1Obj = document.querySelector('#btn1');
     var boxObj = document.querySelector('#box');
     // 2 绑定点击事件
         btn1Obj.onclick = function(){
             // 3 修改box的css的width
             boxObj.style.width = '400px';
         }
    
    // 高度的改变
    var btn2Obj = document.querySelector('#btn2');
        btn2Obj.onclick = function(){
            // 修改高度
            boxObj.style.height = '400px';
        }

    // 颜色的修改
    var btn3Obj = document.querySelector('#btn3');
        btn3Obj.onclick = function(){
            // 修改高度
            boxObj.style.backgroundColor = 'yellow';
        }

            // 内容的修改
    var btn4Obj = document.querySelector('#btn4');
        btn4Obj.onclick = function(){
            // 修改高度
            boxObj.innerHTML = '朝闻道,夕死可矣';
        }
    </script>
</body>
</html>

脚下留心

1  通过js操作css样式时,一定要加px
  boxObj.style.width = '400px';
  
2 通过js添加的样式都会以行内样式的方式追加
非行内样式的获取

现象

.test{

height:200px;

}

<div style="width:200px" class="test" id="id">asd</div>

在这个例子如果我们用 obj.style.height获取的数值将会为空,

a)在ie浏览器里,我们用到obj的currentStyle方法,来获取。 obj.currentStyle["height"]。

b)在非ie浏览器里,我们需要用到window自带的方法,getComputedStyle(obj).height;

这样我们就可以通过js获取元素属性了

综合写法:

    获取非行内样式(兼容问题)

    function getStyle(obj,attr){             //获取非行间样式,obj是对象,attr是值
        if(obj.currentStyle){                //针对ie获取非行间样式
            return obj.currentStyle[attr];
        }else{
            return getComputedStyle(obj,false)[attr];   //针对非ie
        };
    };
浏览器元素的尺寸
offsetParent:获取元素的最近的具有定位属性(absolute或者relative)的父级元素。如果都没有则返回body

                          (与当前元素最近的经过定位(position不等于static)的父级元素)

offsetLeft:表示元素的左外边框至offsetParent元素的左内边框之间的像素距离

offsetTop:表示元素的上外边框至offsetParent元素的上内边框之间的像素距离

clientWidth/clientHeight:元素视窗宽度/高度
clientWidth = width+左右padding
clientHeight = height + 上下padding 
offsetWidth/offsetHeight:元素实际宽度/高度
    offsetWidth = width + 左右padding + 左右boder

   offsetHeiht = height + 上下padding + 上下boder

[外链图片转存失败(img-5Gi4X75e-1567240552414)(/1560692509866.png)]

例题

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box{
			width: 200px;
			height: 100px;
			background: red;
			position: absolute;
			top:40px;
			left:40px;
			padding: 20px;
			border: solid 10px black;

			}
		</style>
	</head>
	<body>
		<div id="box"></div>
	</body>
	<script type="text/javascript">
		var obox = document.getElementById("box")
		
//		obox.offsetWidth = 400;

       	console.log(obox.offsetParent)
		console.log(obox.offsetWidth)
		console.log(obox.offsetHeight)
		console.log(obox.offsetTop)
		console.log(obox.offsetLeft)
	
		
		console.log(document.documentElement.clientWidth)
		console.log(document.documentElement.clientHeight)
		
	</script>
</html>

第四节:实际应用

1.网页换肤

2.简易年历

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			* { padding: 0; margin: 0; }
			li { list-style: none; }
			body { background: #f6f9fc; font-family: arial; }
			
			.calendar { width: 210px; margin: 0 auto; padding: 10px 10px 20px 20px; background: #eae9e9; }
			.calendar ul { width: 210px; overflow: hidden; padding-bottom: 10px; }
			.calendar li { float: left; width: 58px; height: 54px; margin: 10px 10px 0 0; border: 1px solid #fff; background: #424242; color: #fff; text-align: center; cursor: pointer; }
			.calendar li h2 { font-size: 20px; padding-top: 5px; }
			.calendar li p { font-size: 14px; }
			
			.calendar .active { border: 1px solid #424242; background: #fff; color: #e84a7e; }
			.calendar .active p { font-weight: bold; }
			
			.calendar .text { width: 178px; padding: 0 10px 10px; border: 1px solid #fff; padding-top: 10px; background: #f1f1f1; color: #555; }
			.calendar .text h2 {font-size: 14px; margin-bottom: 10px; }
			.calendar .text p { font-size: 12px; line-height: 18px; }
		</style>
	</head>
	<body>
		<div id="tab" class="calendar">
		    <ul id="box">
		        <li><h2>1</h2><p>JAN</p></li>
		        <li class="active"><h2>2</h2><p>FER</p></li>
		        <li><h2>3</h2><p>MAR</p></li>
		        <li><h2>4</h2><p>APR</p></li>
		        <li><h2>5</h2><p>MAY</p></li>
		        <li><h2>6</h2><p>JUN</p></li>
		        <li><h2>7</h2><p>JUL</p></li>
		        <li><h2>8</h2><p>AUG</p></li>
		        <li><h2>9</h2><p>SEP</p></li>
		        <li><h2>10</h2><p>OCT</p></li>
		        <li><h2>11</h2><p>NOV</p></li>
		        <li><h2>12</h2><p>DEC</p></li>
		    </ul>
		    <div class="text" id="txt">
		        <h2>1月活动</h2>
		        <p>快过年了,大家可以商量着去哪玩吧~</p>
		    </div>
		</div>
	</body>
	<script type="text/javascript">
		var arr=['快过年了,大家可以商量着去哪玩吧~',
		'大家好好学习吧222222~~~',
		'大家好好学习吧222222333~~~',
		'大家好好学习吧222444222~~~',
		'大家好好学习555吧222222~~~',
		'大家好好学习吧666222222~~~',
		'大家好好学习吧227772222~~~',
		'大家好好学习吧28888822222~~~',
		'大家好好学习吧99999222222~~~',
		'大家好好学习10000000吧222222~~~',
		'大家好好学习吧111111222222~~~',
		'大家好好学习吧22222200000000000~~~']
		

//		点击月份,取消所有的当前项,给当前元素加上,根据月份找到数组中对应(根据索引对应)的数据
//		点击li时,找到当前点击的是当前li的索引
		
		var aLi = document.querySelectorAll("#box li");
		var oH2 = document.querySelector(".text h2")
		var oP = document.querySelector(".text p")
		
//		1.绑定点击事件
		for(var i=0;i<aLi.length;i++){
//			4.在点击事件外,还能拿到i的每个值的时候,将i的值依次绑定给每个元素
//			aLi[i].feng = i;
			aLi[i].setAttribute("feng",i)
			aLi[i].onclick = function(){
//				2.取消所有的当前项
				for(var j=0;j<aLi.length;j++){
					aLi[j].className = "";
				}
//				3.给当前元素加上
				this.className = "active";
				
//				5.在点击事件内,通过this找到点击的元素,获取当前元素身上的自定义属性,拿到所谓的索引
				var index = this.getAttribute("feng");
				
//				6.解析数据,渲染页面
				oP.innerHTML = arr[index];
				oH2.innerHTML = index-0+1 + "月活动";
			}
		}
		
		
		
//		异步
	</script>
</html>

第五节

1.点击按钮换图片
知识点

   事件(onmouseover)
  函数
  获取对象
 修改对象属性

步骤

	1、 给每个导航添加onmouseover事件(鼠标移入事件),调用changeImg();	
	2、 创建changeImg()函数
		获取img对象
		修改img对象的src属性
<li class="current" onmousemove="changeImg(0)">
<a href="#" target="_blank">资讯</a>
</li>
<li class="current" onmousemove="changeImg(1)">
<a href="#" target="_blank">资讯</a>
</li>
<li class="current" onmousemove="changeImg(2)">
<a href="#" target="_blank">资讯</a>
</li>

<script>
function changeImg(num)
{
	// alert(1);	
	
	/*
	步骤
		1、 给每个导航添加onmouseover事件(鼠标移入事件),调用changeImg();	
		2、 创建changeImg()函数
			获取img对象
			修改img对象的src属性
	*/

	// 获取img对象
	var imgOBj = document.getElementById('changeimg');
	// 修改对象src属性
	imgOBj.src = './style/img/lb'+ num +'.jpg';
	
}
</script>
2.tab切换案例
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{margin: 0;padding: 0;list-style: none;}
			.cont{width: 500px;height: 400px;margin: 20px auto;border: solid 1px black;}
			.cont ul{display: flex;border-bottom: solid 1px black;box-sizing: border-box;height: 40px;}
			.cont ul li{flex: 1;border-right: solid 1px black;text-align: center;font: 20px/40px "微软雅黑";}
			
			.msg div{height: 360px;color: #fff;font:40px/360px "微软雅黑";display: none;}
			.msg div:nth-child(1){background: green;}
			.msg div:nth-child(2){background: red;}
			.msg div:nth-child(3){background: blue;}
			
			.cont li.active{background: #ccc;}
			.cont div.active{display: block;}
		</style>
	</head>
	<body>
		<div class="cont">
			<ul>
				<li class="active">原点1</li>
				<li>原点2</li>
				<li>原点3</li>
			</ul>
			<div class="msg">
				<div class="active"><img src=""/></div>
				<div><img src=""/></div>
				<div><img src=""/></div>
			</div>
		</div>
	</body>
	<script type="text/javascript">
		var ali = document.querySelector("ul").children;
		var adiv = document.querySelector(".msg").children;
		
		for(var i=0;i<ali.length;i++){
			ali[i].index = i;
			ali[i].onclick = function(){
				for(var j=0;j<ali.length;j++){
					ali[j].className = "";
					adiv[j].className = "";
				}
				this.className = "active";
				
				adiv[this.index].className = "active"
				
			}
		}
		
	</script>
</html>

		.msg div:nth-child(3){background: blue;}
		
		.cont li.active{background: #ccc;}
		.cont div.active{display: block;}
	</style>
</head>
<body>
	<div class="cont">
		<ul>
			<li class="active">原点1</li>
			<li>原点2</li>
			<li>原点3</li>
		</ul>
		<div class="msg">
			<div class="active"><img src=""/></div>
			<div><img src=""/></div>
			<div><img src=""/></div>
		</div>
	</div>
</body>
<script type="text/javascript">
	var ali = document.querySelector("ul").children;
	var adiv = document.querySelector(".msg").children;
	
	for(var i=0;i<ali.length;i++){
		ali[i].index = i;
		ali[i].onclick = function(){
			for(var j=0;j<ali.length;j++){
				ali[j].className = "";
				adiv[j].className = "";
			}
			this.className = "active";
			
			adiv[this.index].className = "active"
			
		}
	}
	
</script>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值