JavaScript学习笔记(十四)--BOM

285 阅读6分钟

BOM

  • BOM: browser object model,是把browser 浏览器看成是一个对象,就是学习浏览器对象的各种方法和属性;
  • 浏览器对象:window对象;

BOM 的核心: window 对象

  • 特点:
    • 所有window对象的属性和方法,大部分可以直接省略 window.,而直接使用
    • 因为window对象在浏览器中被称为顶级对象;
    • 顶级对象:页面中所有的东西都是依赖于这个对象存在的;
    • 变量与函数:
      • 所有的全局变量和全局函数都是window对象的属性和方法;
      • 在js代码里面,不使用var声明的变量,都是隐式全局变量,这个方式是不推荐的,因为如果不使用var声明,是不会变量提升的;

	// 1.所有window对象的属性和方法,直接省略  `window.`
document.getElementById('xx');


  // 2.顶级对象
console.log(window.document == document);


 // 3.全局变量和函数 都是window上的挂载
var a = 10;
console.log(window.a);

 function fn() {
     console.log(1);
 }
 window.fn();
 fn();


 // 4.隐式变量:定义变量,变量赋值;
 b = 2;  
 console.log(window.b);  //设置到window这个对象上;

 // 访问变量:无赋值,就是访问变量;报错,无定义;
 c;
 console.log(window.c);


方法:onload

  • 作用:页面加载完毕的时候执行
  • 页面加载完毕:页面所需的静态资源全部加载完毕;
  • 静态资源: html文件、css文件、js文件、图片,
  • 这个方法调用一般是用window.onload 不省略window;

	window.onload = function(){
    // 想要获取图片的宽高,就需要等待图片加载完成后才执行后面的函数;
}


方法:定时器

一次性定时器

  • 倒计时多少时间以后执行函数
  • 语法: setTimeout(要执行的函数,多长时间以后执行)
  • 会在你设定的时间以后,执行函数

  	var timerId = setTimeout(function () {
 	console.log('我执行了')
	}, 1000)
	console.log(timerId) // 1
   
  • 时间是按照毫秒进行计算的,1000 毫秒就是 1秒钟
  • 所以会在页面打开 1 秒钟以后执行函数
  • 只执行一次,就不在执行了
  • 返回值是,当前这个定时器是页面中的第几个定时器

永久性的定时器

  • 每间隔多少时间就执行一次函数
  • 语法: setInterval(要执行的函数,间隔多少时间)
	var timerId = setInterval(function () {
 	console.log('我执行了')
	}, 1000)
  • 时间和刚才一样,是按照毫秒进行计算的
  • 每间隔 1 秒钟执行一次函数
  • 只要不关闭,会一直执行
  • 返回值是,当前这个定时器是页面中的第几个定时器

定时器的返回值

  • 设置定时器的时候,他的返回值是部分 setTimeout 和 setInterval 的
  • 只要有一个定时器,那么就是一个数字
var timer = setTimeout(function () {
 console.log('一次性定时器')
}, 1000)
​
var timer2 = setInterval(function () {
 console.log('永久性定时器')
}, 1000)
​
console.log(timer) // 1
console.log(timer2) // 

关闭定时器

  • 我们刚才提到过一个 timer,是表示这个定时器是页面上的第几个定时器
  • 这个 timer 就是用来关闭定时器的名字
  • 我们有两个方法来关闭定时器 clearTimeout 和 clearInterval
	var timer = setTimeout(function () {
 	console.log('一次性定时器')
	}, 1000)
    // 停止的定时器
	clearTimeout(timer)
    
  • 关闭以后,定时器就不会在执行了
	var timer2 = setInterval(function () {
 	console.log('永久性定时器')
	}, 1000)
     // 停止的定时器
	clearInterval(timer2)
  • 原则上是
    • clearTimeout 关闭 setTimeout
    • clearInterval 关闭 setInterval
  • 但是其实是可以通用的,他们可以混着使用
	var timer = setTimeout(function () {		 
    console.log('一次性定时器')
	}, 1000)
	// 关闭定时器
	clearInterval(timer)
​
	var timer2 = setInterval(function () {
 	console.log('永久性定时器')
	}, 1000)
	// 关闭定时器
	clearTimeout(timer2)

案例:获取验证码-倒计时

  • 获取元素:按钮
  • 注册事件:click
  • 点击之后:
    • 按钮表现为禁用状态;
    • 倒计时设置:
      • 开始计时,初始化
      • setInterval 1秒间隔,设置:
        • time--:
        • 改变按钮的值;
        • 清除倒计时:time==0时清除定时器;按钮恢复文字和可点击的样式;

// 2. 注册事件 点击之后:
//  2.1 按钮变灰
//  2.2 文字立马显示
//  2.3 开启定时器;文字显示;
//  2.4 判断定时器 是否到达0s;恢复原状;

// 获取按钮
var btn = document.getElementById('getCode');
// 注册点击事件
btn.onclick = function(){
  // 禁用按钮,禁用不能点击了;
  btn.disabled = true;
    
  // 开始倒计时
  var time = 5;
  // 在点击的时候,先改变一次
  btn.value = '获取验证码('+ time +')';
   
  // 设置倒计时
  var timer = setInterval(function(){  
    // 每隔1秒钟,数字要减少1
    time--;  
    // 修改按钮的内容
    btn.value = '获取验证码('+ time +')';   
      
    // 当倒计时到达0的时候,停止定时器
    if(time === 0){
      // 停止的定时器
      clearInterval(timer);
      // 把按钮还原
      // 文字还原
      btn.value = '获取验证码';
      // 可以点击
      btn.disabled = false;
    }
      
  },1000);
}


属性:location

  • location:负责管理浏览器地址栏相关的行为和信息的对象;
  • 属性: location.href 属性;该属性存储的是浏览器地址栏内 url 地址的信息,
    • 获取:当前浏览器的地址;
    • 重新设置,页面就会发生跳转;
// 如果想要使用js进行跳转,只需要 location.href = 新的地址;
location.href = 'https://www.jd.com';
  • location.reload
    • location.reload() 这个方法会重新加载一遍页面,就相当于刷新是一个道理
      	window.location.reload()
      
    • 注意: 不要写在全局,不然浏览器就会一直处在刷新状态

localStorage

  • local:本地;
  • Storage:储存;
  • 以前:我们在页面上操作一些,一刷新没有了。
  • 把数据进行本地储存,刷新还是操作后的样子;
  • 本地:本地指浏览器,储存指浏览器可以储存数据

  /*以前:页面新增完数据后,刷新就没有了;
    原因:新增的数据没有被保存下来;‘
    解决:把数据保存在 浏览器 里面;
    如何使用:
    语法:localStorage 属性名;
    值:对象(属性和方法的集合体)*/

  /*方法:存入
    参数1:存入本地哪个字段内。什么名字;键;位置;
    参数2:存入的数据
    真实存入(本地浏览器、小U盘)数据:*/
    localStorage.setItem("a", "---------------------");
    localStorage.setItem("b", "1234");


  /* 方法:拿出真实存的数据;
     参数:键,位置;
     返回:读取的数据;如果读取一个不存在的数据,返回null;*/
     var info = localStorage.getItem("c");
     console.log(info);
  // 数据覆盖:
    localStorage.setItem("b", "9999");



  /* 方法:真实清除某条数据
    参数:键,位置;*/
   localStorage.removeItem("b");



  // 方法:全部清除;
   localStorage.clear();


JSON

  • 上面的问题:把对象变为字符串?手动变;麻烦也容易出错;有方法可以实现
  • JSON是个字符串,有一定格式的字符串;
  • 格式:模拟JS对象和数组的格式;
  // [] JS 数组  {} 对象
  // JSON: []模拟表示数组   {} 模拟对象  在字符串
  var str = '[{"name":"酸 菜","age":12,"sex":"男"},{"name":"翠 花","age":13,"sex":"女"}]';

  • JSON方法:我们自己转json格式比较麻烦;js提供了JSON方法,里面封装好了很多跟json操作相关的方法

	// 将对象转换为json格式的字符串
	// 返回值:一个满足json格式的 字符串
	JSON.stringify(对象);

	// 将json格式的字符串 转换为 对象
	// 返回值:依赖于你的json格式字符串,可能返回数组,或者是对象....
	JSON.parse(json格式字符串);

BOM方法:获取DOM节点样式

	// Computed:计算后的样式
	// 返回值: 当前作用在这个元素身上的所有样式的集合对象  BOM的方法;
	// 属性:具体的属性 无论是行内的还是CSS样式设置的,都可以获取到;字符串
	var res = window.getComputedStyle(元素对象);
	res.width 

	// 只能操作行内属性;
	var dom = document.getElementById('xx');
	dom.style.color

属性:获取元素对象的实际(显示)宽度和高度

  • 元素的实际宽高 = border+padding+content(width和height)

	// 返回值:数值;

	// 只能进行获取;
	// 元素的实际宽度
	元素.offsetWidth 
	// 元素的实际高度
	元素.offsetHeight