十一、JavaScript之BOM和DOM操作
一、BOM操作
Browser Object Model 浏览器对象模型
window 对象中存储所有对浏览器操作的方法
window 顶级对象中存储的方法可以不写window,也能正常调用
1 window.alert('我是弹窗功能1111'); 2 alert('我是弹窗功能2222');
1、常见弹窗
警告框
1 window.alert('弹出内容')
输入框
1 window.prompt('输入框提示信息');
确认框
1 window.confirm('确认框提示信息');
2、监听滚动条
1 window.onscroll = function(){ 2 // 执行程序内容 3 }
1 var h1 = document.documentElement.scrollTop; 2 var w1 = document.documentElement.scrollLeft;
1 var h2 = document.body.scrollTop; 2 var w2 = document.body.scrollLeft;
兼容语法
1 var h = document.documentElement.scrollTop || document.body.scrollTop; 2 var w = document.documentElement.scrollLeft || document.body.scrollLeft;
3、事件类型
事件对象:绑定事件的标签对象
事件类型:触发事件的类型,click是事件类型,onclick是绑定事件
-
鼠标事件 : 鼠标的各种点击、移动
-
键盘事件 : 键盘的各种按键
-
表单事件 : form标签相关的事件
-
1 // 标签对象.onclick = function(){} 2 var oDiv = document.querySelector('div'); 3 oDiv.onclick = function () { 4 console.log('鼠标点击'); 5 }
1 // 鼠标事件绑定给整个文档--document 2 document.onclick = function(){ 3 console.log(456); 4 }
-
-
dbclick:鼠标左键双击
-
contentmenu:鼠标右键单击,一般阻止默认点击事件
-
mousedown:鼠标按下,永远只执行一次
-
mouseup:鼠标抬起
-
mousemove:鼠标移动
-
mouseover:鼠标移入
-
mouseout:鼠标移出
-
mouseenter:鼠标移入
-
1 // mouseover和mouseout在经过当前绑定事件的标签,以及标签的子级元素,都会触发事件 2 // 经过当前标签,只触发移入或者移出
1 // mouseenter和mouseleave只有经过当前标签的边界时会触发,经过子级标签不会触发
键盘事件:
-
-
只有可以被选中的标签可以绑定,也就是css样式中可以获取鼠标焦点的标签,才支持键盘事件(input , textarea , select , button , a超链接)
-
document可以被绑定
-
keydown:键盘按下
-
鼠标按下事件,一直按住只会触发一次
-
键盘按下事件,一直按住会一直触发
-
-
1 var oDiv = document.querySelector('div'); 2 3 oDiv.onkeyup = function(){ 4 console.log(456); 5 }
-
-
在定义事件处理函数时,如果定义一个形参,JavaScript程序会自动向这个形参存储数据
-
形参中存储的是事件对象的相关数据信息
-
-
1 document.onkeydown = function (e) { 2 // 兼容低版本IE事件对象window.event 3 e = e || window.event; 4 // 兼容低版本的火狐浏览器e.which获取按键编码 5 var keyCode = e.keyCode || e.which; 6 // altKey、ctrlKey、shiftKey判断是否按下alt、ctrl、shift 7 // 判断按键是否是 alt + ctrl + j (74) 8 if (e.altKey && e.ctrlKey && keyCode === 74) { 9 console.log('三个按键都按下') 10 } 11 }
触屏事件:
只有移动端设备(终端) 支持触摸事件
-
-
标签对象.ontouchend:触摸结束事件
-
标签对象.ontouchmove:触摸移动事件
-
长按事件:判断触摸开始和触摸结束的时间间隔,大于1秒
-
轻触事件:判断触摸开始和触摸结束的时间间隔,小于 0.1秒
-
左滑事件:判断触摸开始和触摸结束的时间坐标位置
-
放大事件
-
特殊事件:
表单事件:
- 要阻止默认事件的执行
1 // 例如点击button按钮就会执行提交表单事件 2 // 点击鼠标右键,弹出的内容,也是默认事件,也可以阻止 3 // 阻止鼠标右键事件 4 document.oncontextmenu = function (e) { 5 // 事件对象的兼容 6 e = e || window.event 7 8 // 阻止右键单击,默认事件的执行,没有不会弹出默认的右键菜单 9 if (e.preventDefault) { 10 // 普通浏览器,阻止默认事件的方式 11 e.preventDefault() 12 } else { 13 // 低版本IE浏览器阻止默认事件方式 14 e.returnValue = false; 15 } 16 console.log(123); 17 }
- submit 表单提交事件
1 <form action="./01_复习.html" method="GET"> 2 账号: <input type="text"><span name="1"></span><br> 3 密码: <input type="password"><span name="2"></span><br> 4 <button>提交</button> 5 </form>
1 var oFrom = document.querySelector('form'); 2 oFrom.onsubmit = function(e){ 3 // 兼容事件对象 4 e = e || window.event; 5 6 // 阻止默认事件的执行 7 if (e.preventDefault) { 8 // 普通浏览器,阻止默认事件的方式 9 e.preventDefault() 10 } else { 11 // 低版本IE浏览器阻止默认事件方式 12 e.returnValue = false; 13 } 14 15 var oIpt1 = document.querySelectorAll('input')[0].value; 16 var oIpt2 = document.querySelectorAll('input')[1].value; 17 18 // 获取两个span标签,准备写入提示信息 19 var oSpan1 = document.querySelectorAll('span')[0]; 20 var oSpan2 = document.querySelectorAll('span')[1]; 21 22 // 验证判断账号 23 if (oIpt1.length >= 8 && oIpt1.length <= 16) { 24 // 账号符合规范,给账号之后的span,内容清空 25 oSpan1.innerHTML = ''; 26 } else { 27 // 账号不符合规范,给账号之后的span,添加内容 28 oSpan1.innerHTML = '<em style="color:red">账号不符合规范<em>'; 29 } 30 31 // 验证判断密码 32 if (oIpt2.length >= 8 && oIpt2.length <= 16) { 33 // 密码符合规范,给密码之后的span,内容清空 34 oSpan2.innerHTML = ''; 35 } else { 36 // 密码不符合规范,给密码之后的span,添加内容 37 oSpan2.innerHTML = '<em style="color:red">密码不符合规范<em>'; 38 } 39 }
4、事件的绑定
-
-
如果给同一个标签,绑定相同类型的事件,后绑定的事件处理函数会覆盖之前绑定的事件处理函数
-
给标签添加监听事件,绑定事件类型和事件处理函数
-
标签对象.addEventListener('事件类型' , 匿名函数function(){});
-
标签对象.addEventListener('事件类型' , 函数名称fun);
-
-
删除绑定的事件处理函数(匿名函数语法绑定的方法无法删除)
-
1 var oDiv = document.querySelector('div'); 2 // 添加监听事件 3 oDiv.addEventListener( 'click', fun3 ); 4 // 删除监听事件 5 oDiv.removeEventListener( 'click', fun3 ); 6 function fun3(){ 7 console.log('事件绑定'); 8 }
- 低版本IE绑定语法
1 // 匿名函数绑定 2 oDiv.attachEvent('onclick', function(){ 3 console.log(123); 4 }) 5 // 函数名称绑定 6 oDiv.attachEvent('onclick' , fun2)
5、地址栏相关信息
浏览器地址栏的相关信息都存储在window.location属性中
-
-
中文会显示为 %2位十六进制数值形式
-
如果只是浏览器使用,没有必要转化,浏览器可以正常的解析显示这些内容
-
判断比较时需要转化为中文
-
decodeURI()
-
decodeURIComponent()
-
-
可以通过设定window.location.href来完成页面的跳转,不再需要超链接
-
-
window.location.search:
-
通过get方式,在地址栏中存储的传参数据信息
-
-
6、浏览器历史记录
浏览器跳转过的页面的记录,window.history
-
-
存储浏览器的历史记录
-
是当前这个窗口的浏览记录,新窗口打开的页面不算浏览记录
-
window.history.length:次数
-
window.history.back():上一个浏览的页面
-
window.history.forward():下一个浏览的页面
-
window.history.go():根据括号中正负数值跳转
-
window.history.back():效果等于 window.history.go(-1)
-
-
7、浏览器对象信息
存储与浏览器配置等相关的信息,window.navigator
-
-
window.navigator.appVersion:浏览器版本信息
-
window.navigator.appName:浏览器名称,Netscape网景公司名称
-
8、浏览器的事件
-
-
如果js代码在html代码之前,html代码还没有执行,无法正确获取到div标签
-
让定义的程序在浏览器所有内容都加载之后,再执行
-
-
window.onscroll:浏览器滚动条监听事件
-
window.onresize:浏览器窗口大小监听事件
-
window.open():在新窗口打开页面事件
-
9、获取浏览器宽高
浏览器的宽度和高度只能获取不能设定
- 包含滚动条
1 var w1 = window.innerWidth; 2 var h1 = window.innerHeight;
- 不包含滚动条
1 var w2 = document.documentElement.clientWidth; 2 var h2 = document.documentElement.clientHeight;
二、DOM操作
Document Object Model 文档对象模型
对文档的操作,document 的顶级对象
-
获取DOM文档中标签对象模型
-
-
1 // document.getElementById()是JavaScript固定的语法形式,必须特别注意大小写 2 // ()中必须以字符串的形式,定义id属性的属性值,做匹配查询 3 var oDiv1 = document.getElementById('div1');
-
-
将获取到的标签对象,定义成一个伪数组
-
如果要通过for...in循环对其中的标签对象进行操作,会引起报错,因为会有多余的伪数组的函数方法参与循环
-
-
1 var oDivs1 = document.getElementsByTagName('div'); 2 3 // for循环 4 for(var i = 0 ; i <= oDivs1.length-1 ; i++){ 5 console.log(oDivs1[i]); 6 }
-
-
通过class属性的属性值获取标签对象,定义成伪数组
-
for...in循环遍历,操作标签对象也是会报错
-
-
1 var oDivs2 = document.getElementsByClassName('div2');
-
-
执行结果也是一个伪数组,但是是包含 forEach() 方法的伪数组
-
-
1 var oDivs3 = document.getElementsByName('div3');
-
低版本的IE浏览器不支持
-
1 // document.querySelector() 2 // 获取第一个匹配条件的标签对象,只会获取一个标签对象 3 4 // 通过标签名称获取标签对象 5 var oDiv = document.querySelector('div'); 6 7 // 通过id属性值获取标签对象 8 var oDiv1 = document.querySelector('#div1'); 9 10 // 通过class属性值获取标签对象 11 var oDiv2 = document.querySelector('.div2'); 12 13 // 其他属性的属性值 14 var oDiv3 = document.querySelector('[name="div3"]'); 15 16 // 兄弟选择器 17 var oSpan1 = document.querySelector('[name="div4"]~span'); 18 19 // 父子选择器 20 var oLi1 = document.querySelector('ul>li'); 21 22 // 后代选择器 23 var oLi1 = document.querySelector('ul li');
1 // document.querySelectorAll() 2 // 获取所有匹配条件的标签对象,执行结果是伪数组,可以使用forEach方法 3 var oLis1 = document.querySelectorAll('ul>li');
2、操作标签文本内容
innerHTML 和 innerText 执行的都是全覆盖写入操作
-
标签对象.innerHTML:
-
-
可以解析标签
-
可以获取标签对象中,内容以及子级标签名称和子级标签内容
-
1 var oDiv = document.querySelector('div'); 2 oDiv.innerHTML = '<ul><li>我是ul,li标签</li></ul>';
-
-
不支持获取和写入标签对象,只支持文本操作
-
不能解析标签
-
-
1 var oDiv = document.querySelector('div'); 2 3 // 写入的字符串内容如果有标签名称,不能支持解析标签 4 // 显示效果是纯字符串效果 5 oDiv.innerText = '<ul><li>我是ul,li标签</li></ul>';
3、操作标签属性和属性值
-
可以直接通过点语法或者[]语法来操作的属性
-
标签.id:可以操作设定 id属性和属性值
-
标签.className:可以操作设定 class属性和属性值
-
直接写是获取,带有赋值的是设定
-
标签对象.id、标签对象.className:获取属性值
-
-
1 // <div id="div1" class="div2" title="我是div">我是一个div标签</div> 2 var oDiv = document.querySelector('div'); 3 4 // 获取属性值 5 console.log(oDiv.id); 6 console.log(oDiv.className); 7 console.log(oDiv.title); 8 9 // 设定属性值 10 oDiv.id = 'ddd'; 11 oDiv.className = 'ccc'; 12 oDiv.title = '我是设定的提示内容';
1 oDiv.getAttribute('class')
- 设定属性值:setAttribute('属性' , '属性值')
1 oDiv.setAttribute('index', 1);
4、特殊标签的获取
方法1:低版本IE浏览器也支持
方法2:不兼容低版本IE浏览器
1 // 1,body标签 2 var oBody1 = document.body; 3 var oBody2 = document.querySelector('body'); 4 5 // 2,head标签 6 var oHead1 = document.head; 7 var oHead2 = document.querySelector('head'); 8 9 // 3,html标签 10 var oHtml1 = document.documentElement; 11 var oHtml2 = document.querySelector('html');
5、操作标签样式
-
-
标签对象.style.属性
-
-
设置标签样式
-
标签对象.style.css样式 = 属性值
-
-
1 var oDiv = document.getElementById('div'); 2 oDiv.style.color = 'blue';
-
- 不支持 - 减号符号,减号是作为减法运算符执行,在style中定义css样式要去掉减号,使用小驼峰命名法,font-size要写成fontSize
-
-
标签对象.style.属性
-
只能获取标签行内样式属性的属性值
-
其他 内部样式 / 外部样式 设定的属性的属性值,获取结果是空字符串
-
-
获取标签执行的css样式属性的属性值
-
不管是行内、内部、外部css样式设定的属性值
-
获取的是最终标签执行的css样式的属性值
-
-
-
1 window.getComputedStyle(oDiv).width
-
-
- 版本IE浏览器:标签对象.currentStyle.属性
-
1 oDiv.currentStyle.width
6、获取标签占位信息
1 var oDiv = document.querySelector('div');
获取宽高(内容)+ padding + border
1 // 水平方向,左右的padding和border都算 2 console.log( oDiv.offsetWidth ); 3 // 垂直方向,上下的padding和border都算 4 console.log( oDiv.offsetHeight );
获取宽高(内容)+ padding
1 // 水平方向,左右的padding都算 2 console.log( oDiv.clientWidth ); 3 //垂直方向,左右的padding都算 4 console.log( oDiv.clientHeight );
独立获取边框线宽度
1 // 上边框线宽度 2 console.log( oDiv.clientTop ); 3 // 左边框线宽度 4 console.log( oDiv.clientLeft );
通过获取css样式来获取右下边框线的宽度
1 console.log( window.getComputedStyle(oDiv).borderRightWidth ); 2 console.log( window.getComputedStyle(oDiv).borderBottomWidth );
获取与定位父级对象的间距
1 // console.dir(标签对象),其中有一个属性offsetParent,就是定位的父级对象 2 // 1、父级没有定位属性,定位对象是body 3 // 2、父级有定位属性,定位对象是父级标签 4 // 3、标签有fixed,定位对象是视窗窗口 5 // console.dir(标签对象)看offsetParent后定义的标签 6 console.dir( oDiv ); 7 console.log( oDiv.offsetTop ); 8 console.log( oDiv.offsetLeft );