DAY09-BOM和DOM

JavaScript的组成:ECMAScript、BOM、DOM,其中ECMAScript为JavaScript的核心,但是如果要在浏览器中使用JavaScript,那么BOM才是JavaScript的核心。

也就是说,无论ECMAScript有多权威,进了浏览器,就得遵守浏览器的规则。

BOM浏览器对象模型

BOM简介

BOM是英文Browser Object Model的首字母缩写(浏览器对象模型)

BOM作用

它提供了一系列对象用于与浏览器窗口进行交互,这些对象通常统称为BOM 如:获取浏览器信息,操作浏览器.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJwBAyy4-1662463971274)(/1560515950954.png)]

window(浏览器窗口对象,主要用于操作浏览器,浏览器中最大的对象,BOM核心对象)

location(地址栏对象 - 提供了对地址栏操作的方法和属性)

history(浏览历史对象,提供了对浏览器历史记录操作的方法和属性)

screen(屏幕对象,获取屏幕的信息)

navigator(浏览器对象,提供了获取浏览器信息的方法和属性)

document(文档对象, - 代表整个网页,DOM的根节点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tQ9Utnil-1662463971276)(/1560563858508.png)]

window对象[掌握]
属性
属性名描述
window.innerWidth获取当前网页可显示区域宽度问题:ie有兼容性问题解决:document.documentElement.clientWidth
window.innerHeight获取当前网页可显示区域高度问题:ie有兼容性问题解决:document.documentElement.clientHeight

脚下留心

1、写属性加上对象名(建议)

2、innerWidth 的width首字母大写

例1: 获取当前网页的宽度和高度(注意兼容性问题)

var w = window.innerWidth ? window.innerWidth :  document.documentElement.clientWidth;

var h = window.innerHeight ? window.innerHeight :  document.documentElement.clientHeight ;

document.write("当前网页可显示区域宽:" + w + ",高度:" + h);
方法

自己声明的函数也是win的方法

方法描述
alert()
prompt(输入框提示信息,输入框默认值)提示框
confirm(确认框提示的信息)确认框
open(待打开的网页,窗口名,‘height=400,width=400,top=10,…’)打开网页
close()关闭当前网页
scrollBy(x,y)控制当前可视窗口的滚动
scrollTo(x,y)控制当前可视窗口的滚动

例1

<script type="text/javascript">
		window.alert(123)
		var a = prompt("你叫什么名字")
		console.log(a)
		var a = confirm("你冲钱么")
		console.log(a)
		
		
		function fn(){
			var a = confirm("你冲钱么?")
			if(a){
				alert("欢迎尊贵的会员")
			}else{
				fn()
			}
		}
		fn()
       var res = null;
        // 给documen绑定事件,点击打开新的页面
		document.onclick = function(){
		   res =   window.open('http://www.baidu.com', 'hello', 'height=400,width=400,top=100,left=200')
		}
		// 关闭当前窗口
		var a = confirm("确认关闭此页面么")
		if(a){
		 	res.close()
		}
		
	</script>
		

例2:控制当前页面的滚动(一定得有滚动条)

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
  <script>
    function scrollWindow() {
      //滚动到距离左边,顶部各100像素的位置
      window.scrollBy(100, 100);
      window.scrollTo(100, 100);
      
      // 以对象的形式入参
       window.scrollTo({
        // left: 100,
        top: 100,
        behavior: 'smooth'  // 平滑滚动
      })
    }
  </script>
</head>

<body>

  <input type="button" onclick="scrollWindow()" value="滚动条" />
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 </p>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>
  <br>

</body>

</html>
window内置子对象
history对象[了解]:

该对象包含浏览器访问过的url。

属性:

名称作用
history.length返回当前窗口历史记录的数量

方法:

名称作用
history.forward()前进,需要后退一下之后,才有前进的方向
history.go(num)参数为正,前进相应的数目,为负,后退相应的数目,为0,刷新
history.back()后退,加载前一个url。

例1:history.length输出

      // 输出浏览过的历史长度
      console.log(history.length);

例2:编写a.html在其中添加超链跳到b.html.

a.html
<body>
    <a href="./b.html">点我跳转</a>
     <br />
    <input type="button" value="goForward" onclick="goForward()">
    <script>
                 
      function goForward(){
          window.history.forward();
     }             
        
    </script>
</body>
b.html
<body>

<input type="button" value="goBack" onclick="goBack()">

</body>
<script> 
     function goBack(){
         window.history.back(); //点我返回
     }
     var len  = window.history.length;   // 当前窗口浏览总长度
     console.log(len);
</script>
location对象[掌握]

包含当前url的相关信息,而history对象不能具体反映url的相关信息。

属性作用
location.href设置或返回完整的url
location.search返回url?后面的查询部分(参数)
location.hash是一个可读写的字符串,是url的锚部分(从#开始的部分)
location.reload(bool)刷新页面的方法,传递一个true,表示从浏览器加载
location.assign(url)跳转到指定目录
location.replace(url)修改当前的地址,且不能后退

例:

<input type="button" value="获取网址" onclick="getUrl();" />
<input type="button" value="跳转网址" onclick="goUrl();"/>
<input type="button" value="刷新网页" onclick="shuaXin();" /> 

<script>
// 创建获取网址方法
function getUrl(){
    console.log(location.href);	
}

// 创建跳转网址方法
function goUrl()
{
    // location.href = 'http://baidu.com'; // 跳转百度
    location.href = './1-延时器和定时器.html'; 
}


// 创建刷新网址方法
function shuaXin(){
    location.reload(); 
}

</script>

多学一招:

在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。
比如,下面URL的原意是指定一个颜色值:
  http://www.example.com/?color=#fff
  JD秒杀的页面,点击不同商品,#后数字不同
  https://miaosha.jd.com/#11782112078
onload 事件

window.onload = function // 当html都加载完成,才执行里面的js

  //  当文档加载完成后执行一些操作
    window.onload = function(){
        console.log("页面加载完成")
    }

图片加载获取src时的使用

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>谁先出来哈哈</title>
<script>
// 必须使用onload才能获取到图片地址
// 与执行顺序有关
   window.onload = function(){
        var img = document.querySelector('img');
        console.log(img.src)
    }
</script>
</head>
<body>
	
<img src="https://img11.360buyimg.com/n8/jfs/t1/45887/8/5561/569642/5d3568dbEadc7afc3/6f4cbfe082807cba.jpg">
	
</body>
</html>

一般是控制资源的获取,必须是加载完成才能获取.就要使用onload

窗口事件[掌握]
onscroll滚动事件

例1:在页面中填充内容,出现滚动条时

 <body style="height: 1000px;">
 window.onscroll = function(){

        console.log(1)            //当页面发生滚动时,打印1

    }

滚动条位置获取
 页面滚动条距离顶部的距离

 document.documentElement.scrollTop

 document.body.scrollTop  (兼容写法)
 
 
 页面滚动条距离左边的距离
 document.documentElement.scrollLeft

  document.body.scrollLeft   (兼容写法)


综合的写法

// 工作中兼容的写法
    // || 两侧表达式谁存在使用谁,两侧都存在使用左侧的
    // var a=10;
    // var b=2;
    // var c= b || a;
    // console.log(c);

<body style="height: 1000px;width:2000px;">
     window.onscroll=function(){
      //  console.log('我检测到了!') 
       // 获取滚动条距离顶部的位置,一定写在滚动条事件中
       var top = document.documentElement.scrollTop || document.body.scrollTop;
          console.log(top);
          
        var left = document.documentElement.scrollLeft || document.body.scrollLeft;
        console.log(left)
     }
onresize窗口大小改变时触发
    window.onresize = function(){
        console.log(1)            //当窗口大小发生改变时,打印1
    }

练习

广告弹出框(自动关闭)

页面加载完成之后,自动打开一个广告弹出框,10秒中之后自动关闭,关闭之前,在这个弹出框中有至少两个功能.

<!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>
<style>
  #box{
      width: 200px;
      height: 200px;
      border:1px red solid;
      position: absolute;
      right: 0px;
      bottom:0px;
      background:#ccc;
      display:  none;
  }

</style>
<body>
    <div id="box">
        <input type="button" value="X" id="btn">

    </div>
    <script>
    // 目标:在右下角弹出一个框,可以点击关闭
     // 1 指定页面加载完成后,显示
     window.onload = function(){
        // 2 获取box节点
        var boxObj = document.getElementById('box');
         // 3 设置css属性显示广告框
           // style用于css样式的设置
         boxObj.style.display = 'block';
          //4 给btn绑定点击事件,可以关闭广告框
        var btnObj = document.getElementById('btn');
            btnObj.onclick = function(){
                // 5 再次设置广告框的css属性
               // boxObj.style.display='none';
                // 重新定向网址,流氓软件做法
                location.href = 'http://jd.com/';

            }
        // 使用延时器,十秒之后关闭
        setTimeout(function(){
            boxObj.style.display='none';
        },10000);
     } 
    </script>
</body>
</html>

DOM的概念和作用[掌握]

1 DOM简介与作用

DOM是英文Document Object Model的首字母缩写(文档对象模型)

使javascript有能力操作HTML文档(获取HTML标记元素,添加HTML标记元素,删除HTML标记元素等)

2. DOM的分类

核心 DOM

  • 提供了操作HTML元素的属性和方法

  • 遍历DOM树、添加新节点、删除节点、修改节点

HTML DOM

  • 提供了查找改变HTML元素的属性和方法

    以一种简便的方法访问DOM树
    

CSS DOM

  • 提供了操作CSS的属性和方法

事件 DOM

 事件对象模型(如:onclick.....)
3 DOM的树形结构(节点树)

在DOM中,文档的层次结构被表示为树形结构。

树是倒立的,树根在上,树叶在下面,树的节点表示文档中的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QW4YwuMK-1662463971277)(/1560569155700.png)]

4 节点关系

根节点:一个HTML文档只有一个根,它就是HTML节点。

子节点:某一个节点的下级节点。

父节点:某一个节点的上级节点。

兄弟节点:两个子节点同属于一个父节点。

节点的分类

【属性节点(attribute)】,指定是HTML标签的属性

<input name="user" value="张三" id="name" type="text" class="us" goodsId='22' >
除了input本身, name,value,id等都是属性

【文本节点(text)】,指定是HTML标签的内容

<p> 春江水暖鸭先知  </p>

【空白节点】,在主流浏览器中标签和标签之间的换行会理解为一个空白节点,在IE浏览器中不会

<p> 春江水暖鸭先知  </p>
<p> 111111</p>
DOM的选择器(访问节点方法)
getElementById(id)   
描  述:获取网页指定id名字的元素,返回一个对象

语  法:var obj = document.getElementById("id名称")

参  数:id名称(注:需要加引号)

返回值:对象,对象的属性就是HTML标签的属性

getElementsByTagName()

功  能:获取网站指定标签名称的元素
语  法:var obj = document.getElementsByTagName("标签名称")
参  数:标签名称(注:需要加引号)
返回值:返回一个集合(数组),集合中每个元素都是一个单独标签对象

getElementsByName()

功  能:通过标签的name值获取元素
语  法:var obj = document.getElementsByName("标签name名称")
参  数:标签的name名称(注:需要加引号)
返回值:返回值是数组,通常用来获取有name的input的值

getElementsByClassName() //通过class名获取元素,返回值是数组

功  能:通过class名获取元素
语  法:var obj = document.getElementsByClassName()  ("标签的class属性名称")
参  数:标签的class属性名称(注:需要加引号)
返回值:返回值是数组

脚下留心

1.不是所有标签都有name值;
2.在低版本的浏览器中,getElementsByName和getElementsByClassName有兼容性
<!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>
    <p id="poem"> 假如生活不够慷慨,降至以普通的生 </p>

    <p class="str">何必报之以猥琐的活</p>
    <p class="str">因为总要走向远方</p>

    <div>走向远方是为了让生命更辉煌</div>
    <div>如果选择了停下,生活就会用凛冽的北风嘲笑</div>

    <input type="text" name="user">
   <input type="text" name="user" id="">
    <script>
     // 根据id获取节点对象,得到单个节点(常用)
     var p1Obj = document.getElementById('poem');
   //  console.log(p1Obj)
    
     // 根据class进行获取,得到的是一个结果集合(常用)
     // 集合的操作方法和数组一样
     var p2Obj = document.getElementsByClassName('str');
     // console.log(p2Obj);
     // console.log(p2Obj[1]);

      // 根据标签的名称获取,得到的是一个结果集合
      // 集合下标也是从0开始
     var div1Obj = document.getElementsByTagName('div');
     // console.log(div1Obj);
     // console.log(div1Obj[0]);
   //总结:使用class和标签获取,不管页面中有几个元素,得到的都是集合
   // 想要操作那个元素,就要按照下标取出

    // 根据name获取,返回节点列表,和数组的操作一样(根本不用)
    var input1Obj = document.getElementsByName('user');
    console.log(input1Obj)
    console.log(input1Obj[0])
    </script>
</body>
</html>

多学一招:

  ES5选择器:强大到超乎想象,支持IE8+。ECMAScript借鉴了jQuery选择器的
  
    document.querySelector();          //返回匹配到的第一个元素
    document.querySelectorAll();       //返回一个数组,哪怕只有一个元素
   

   可以直接填写,我们需要找的标签名,类名,id名称

例:

 // 根据class进行获取,要写.
     // 页面有多个符合条件的,默认只获取第一个
     var classObj = document.querySelector('.str');
    //  console.log(classObj)

     // 根据标签名称进行获取
     var divObj = document.querySelector('div');
    // console.log(divObj)

    // querySelectorAll() 返回节点集合
    // 只有一个符合条件的也返回集合
    var class1Obj = document.querySelectorAll('.str');
   // console.log(class1Obj);
    // 输出第一个节点
   // console.log(class1Obj[0]);
    
    // 根据id进行获取,返回的也是集合
    var id1Obj = document.querySelectorAll('#poem');
    var ps=document.querySelector("[name=password]");
    console.log(id1Obj)
    console.log(id1Obj[0])
window.onload用法

表单操作

所有的表单元素都是表单elements属性(元素集合)中包含的一个值.

注意:表单元素上,一定要添加name值

	<body>
		<form action="" method="post" name="form2"  >
		
		  <input type="text" name="pwd" id="" value="" />
			<input type="text" name="user" id="" value="" />
			<input type="button" onclick="fn()" value=" 提交" />
		</form>

		<script type="text/javascript">
	       function fn(){
			  let forms = document.querySelector('form')
			  console.log(forms.elements['user']);
			}       
		</script>

练习与作业

1.顶部悬浮-----使用js模拟position:fixed

<style type="text/css">
			body{
			   height: 3000px;
			}
			.top{
                position: absolute;
                line-height: 30px;
                padding: 0 10px;
                background: #ccc;
                left: 0;top:100px;
			}
		</style>
	</head>
	<body>
		<h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1><h1>一级标题</h1>
		<div class="top">回到顶部</div>
	</body>
		var obox = document.querySelector(".top");
//		提前回去元素初始的top值
		var oldT = 100;
		
//		滚动时元素固定在屏幕
//		1.绑定事件
		window.onscroll = function(){
//			2.获取滚动的距离
			var t = document.documentElement.scrollTop;
//			3.计算top,设置回去
			obox.style.top = t+oldT + "px";
		}

缓慢回到顶部

	   var timer;
//		1.绑定事件
		obox.onclick = function(){
//			2.开启之前先清除
			clearInterval(timer);
//			3.正式开启计时器
			timer = setInterval(function(){
//				4.先获取滚动的距离
				var t = document.documentElement.scrollTop;
//				5.不断判断是否到顶
				if(t <= 0){
//					6.到顶就停下
					clearInterval(timer)
				}else{
//					7.没到顶就向上滚动
					document.documentElement.scrollTop = t-20;
				}
			},30)
		}

h1>

一级标题

一级标题


回到顶部


var obox = document.querySelector(“.top”);
// 提前回去元素初始的top值
var oldT = 100;

//		滚动时元素固定在屏幕
//		1.绑定事件
		window.onscroll = function(){
//			2.获取滚动的距离
			var t = document.documentElement.scrollTop;
//			3.计算top,设置回去
			obox.style.top = t+oldT + "px";
		}

缓慢回到顶部

	   var timer;
//		1.绑定事件
		obox.onclick = function(){
//			2.开启之前先清除
			clearInterval(timer);
//			3.正式开启计时器
			timer = setInterval(function(){
//				4.先获取滚动的距离
				var t = document.documentElement.scrollTop;
//				5.不断判断是否到顶
				if(t <= 0){
//					6.到顶就停下
					clearInterval(timer)
				}else{
//					7.没到顶就向上滚动
					document.documentElement.scrollTop = t-20;
				}
			},30)
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值