DOM和BOM总结及事件内容
DOM和BOM总结
BOM(bowser object model)浏览器对象模型
window 窗口对象(全局的变量及函数都是属于window(global对象))
location 地址栏对象(获取地址栏内容 使用地址栏跳转页面)
属性:hash、search、host、hostname、pathname、port、protocol、origin、href
方法:assign、replace
history 历史对象
属性:state、length
方法:forward、back、go、pushState、replaceState
screen 屏幕对象
属性:width、height、availWidth、availHeight...
navigator 导航对象
属性:userAgent
frames 窗口(window)
DOM(document object model)文档对象模型
document 文档对象(整个html文档)
element 元素对象(所有的标签)
attribute 属性对象(所有标签里面的属性)
text 文本对象(显示的文本)
dom里面的知识点:
空文本(换行符、制表符、空格...)也是一个文本节点
属性如果是自身自带的属性 可以直接 . 出来(input.value、img.src、a.href...)如果不是就不能点出来。
dom会操作对应的HTML内容、当你的html内容、当你的html内容发生变化、那么对应的页面就会重新渲染。会造成大量的重绘和回流。(后续的dom操作要被舍弃(效率))
重绘和回流(回流必定重绘)
重绘对应一个元素操作(不改变它的宽高和对应的位置 而改变其他的样式)
回流对应的元素操作(改变对应的元素所有的内容 宽高和对应的位置都会发生变化)
事件
概述:
事件是一个异步机制。它相当于一个执行者执行---观察者---处理函数执行 这个流程称之为事件
事件的组成
事件名(内置的)
执行对象(元素对象)
处理函数(自定义函数)
观察者(js的时间引擎)
例子
我去便利店买包华子,老板告诉我没货。我跟老板说等有货通知我。货来了老板就通知我了,我就去买了。
分析
事件名 ---- 买华子
执行者 ---- 我
观察者 --- 老板
处理 --- 买了华子
示例
<button>点击</button>
<script>
button.onclick = function(){console.log('点击了')
}
</script>
事件名 click(内置的)
执行对象 button(元素对象)
处理函数 后续的函数(自定义函数)
观察者(js引擎 事件线程(引擎))
在js内书写的事件 它的观察者都是事件引擎。我们需要关注的就是前面三个内容(事件名、执行对象、处理函数)
事件的声明书写方式
内联模式(在标签内部)
<!--内联模式就是在onclick书写中设置对应的代码-->
<button onclick="alert('hello')">点我</button>
<button onclick="fn(1)">点我1</button>
<!-- 注:内联模式下调用函数需要手动调用,需要将函数名深厚的'()'带上 -->
<script>function fn(arg){alert('我是函数执行'+arg)console.log(this);//window}
</script>
脚本模式(在script标签内 常用)
<!--脚本模式-->
<button>脚本模式</button>
<script>//脚本模式的写法 事件名 执行对象 处理函数var btn = document.getElementsByTagName('button')[2]//执行对象.on+事件名 = 处理函数btn.onclick = function(){console.log('hello');}function handler(){console.log('处理函数执行了');}//在脚本模式里调用函数不需要手动调用,只需要将对应的函数名赋值给对应的点击事件就可以调用了,如下所示:btn.onclick = handler//内联模式里面的函数调用的this指向window 对应的脚本模式里面的this指向当前的调用者
</script>
内联模式和脚本模式的区别
内联模式下调用函数需要手动调用 而对应的脚本的模式的处理函数是自动调用的
内联模式里面的函数调用的this指向window 对应的脚本模式里面的this指向当前的调用者
事件名分类
鼠标事件(鼠标触发的 mouse)
click 点击事件
dblclick 双击事件
mousedown 按下
mouseup 弹起
mouseenter 移入
mouseleave 移出
mouseover 移入
mouseout 移出
mousemove 移动
contextmenu 右键点击
注意事项
click和对应的mousedown和mouseup的执行顺序(mousedown -- mouseup -- click)
mouseenter(mouseleave)和mouseover(mouseout)的区别(mouseenter 子元素不会触发mouseover子元素会触发)
<style type="text/css">div{background-color: red;width: 100px;height: 100px;}
</style>
<div>我是一个div<div style="background-color:yellow;height:50px;width:50px;float:left"></div></div><script>//获取divvar div = document.querySelectorAll('div')[0]//脚本模式div.onclick = function(){console.log('单击事件执行了');}//双击事件必定触发单击div.ondblclick = function(){console.log('双击事件执行了');}//鼠标的按下和弹起 执行顺序 按下 -- 弹起 -- 单击div.onmousedown = function(){console.log('鼠标按下')}div.onmouseup = function(){console.log('鼠标弹起');}//鼠标的移进和移出//enter和leave 进入子元素不会触发div.onmouseenter = function(){console.log('鼠标移入了');}div.onmouseleave = function(){console.log('鼠标移出了');}//over和out 进入子元素也会触发div.onmouseover = function(){console.log('鼠标over移入了');}div.onmouseout = function(){console.log('鼠标out移出了');}//鼠标的移动div.onmousemove = function(){console.log('鼠标移动了');}//鼠标点击右键(点击事件不会触发)div.oncontextmenu = function(){console.log('鼠标右键点击了');}</script>
键盘事件(键盘触发的 key)
keydown 按下
keyup 弹起
keypress 字符串(除功能键的其他键)
<input type="text" />
<script>//获取输入框var input = document.querySelector('input')//键盘相关事件input.onkeydown = function(){console.log('键盘按下');}//在input 中文输入状态下弹起会出现两次input.onkeyup = function(){console.log('键盘弹起');}//字符键按下(除了功能键)input.onkeypress = function(){console.log('字符键按下');}window.onkeypress = function(){console.log('在window上触发了keypress事件');}
</script>
注意事项
执行顺序 keydown -- keypress -- keyup
keypress一定会触发keydown
HTML事件(HTML中自带的一些事件(只能用于专门的HTML))
window的事件
加载事件(load)
卸载事件(unload)
关闭窗口事件(onclose)
打印之前调用的事件(onbeforeprint)
卸载之前调用的事件(onbeforeunload)
滚动栏发生变化的事件(onscroll)
<style type="text/css">div{height: 100px;width: 100px;overflow: scroll;}
</style>
<body style="height:3000px"><div><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p></div><form action=""><input type="text" /><button type="submit">提交</button><button type="reset">重置</button></form><script>//加载事件window.onload = function(){console.log('hello');}//卸载事件 (刷新)window.onunload =function(){console.log('卸载');}//关闭窗口事件 (清楚相关缓存和对应的资源操作)window.onclose = function(){console.log('关闭');}//打印之前调用 调用print方法之前 能做到更改打印的内容再继续打印window.onbeforeprint = function(){console.log('打印了');}//在卸载之前调用 将一些内容回收window.onbeforeunload = function(){console.log('卸载之前');}//滚动栏滚动window.onscroll = function(){console.log('滚动栏的位置发生变化');}//加载事件的其他使用var image = new Image()//构建一个图片对象image.onload = function(){//如果图片加载好了image.src = '图片地址'//给图片设置对应的src地址}//onscroll的其他使用document.querySelector('div').onscroll = function(){console.log('div的滚动栏滚动了');}</script>
</body>
表单的事件
submit 表单提交事件
reset表单重置事件
select 内容被选中(只针对输入框和文本域)
change 表单的value值发生变化
input 可输入的表单标签里面进行输入
blur 失去焦点
focus 获取焦点
<style type="text/css">div{height: 100px;width: 100px;overflow: scroll;}
</style>
<body style="height:3000px"><div><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p><p>1111111</p></div><form action=""><input type="text" /><button type="submit">提交</button><button type="reset">重置</button></form><script>//表单相关的事件//加给整个form表单的事件document.forms[0].onsubmit = function(){console.log('提交了');}document.forms[0].onreset = function(){console.log('重置了');}//change value值发生变化 失去焦点document.querySelector('input').onchange = function(){console.log('值变化了');}//input 输入对应的值的时候调用document.querySelector('input').oninput = function(){console.log('输入值');}//select 选择里面的内容document.querySelector('input').onselect = function(){console.log('选择值了');}//失去焦点document.querySelector('input').onblur = function(){console.log('失去焦点了');}//聚焦document.querySelector('input').onfocus = function(){console.log('获取焦点了');}</script>
</body>
相关聚焦和失焦的方法
focus 聚焦的方法
blur 失焦的方法
//element也具备 focus() blur()
document.querySelector('input').focus()
setTimeout(function(){document.querySelector('input').blur()
},3000)
event事件源对象
概述
event被称为事件源对象,他是一个全局的内置对象(属于window),他里面包含了一些关于事件执行的相关的属性。
处理函数中Arguments
处理函数也是一个函数,函数就具备一个arguments的属性。arguments是一个伪数组。那么就可以知道对应的处理函数里面也拥有arguments
var btn = document.querySelector('button')
btn.onclick = function(){//点击事件触发以后对应的arguments里面有一个对应的pointerEvent的对象console.log('arguments',arguments);console.log(`arguments[0]`,arguments[0]);//这个对象实在arguments里面存在第一位里面以属性为主 那么这个对象表示什么//这个参数其实就是对应的事件的一些内容 称为事件源对象 event
}
window.onkeydown = function(){console.log('arguments',arguments);//keyboardEvent 键盘的的事件源对象console.log(`arguments[0]`,arguments[0]);
}
从上述代码可得到对应的事件执行的处理函数里面会传递一个参数,这个参数的类型是一个event。这个处理函数的arguments数组里面只有一个元素。
故而我们可以简写为
//这个地方的e 一般写做 e 或者是 event
btn.onclick = function(e){//这个地方的e表示的是第一个参数 也就是对应的event对象 这个event在这个里面有兼容问题//兼容写法e = e || window.event//这个e表示的就是第一个参数 那么他也就是我们对应的event对象console.log(`e`,e);
}
event的常用属性
鼠标坐标的相关属性
screenX 表示鼠标离屏幕的x距离
screenY 表示鼠标离屏幕的y距离
pageX 表示当前的鼠标离页面的x距离 (包含卷起的部分)
pageY 表示当前的鼠标离页面的y距离 (包含卷起的部分)
clientX 表示鼠标离页面可视区的x距离
clientY 表示鼠标离页面可视区的y距离
offsetX 表示鼠标离父元素偏移的x距离
offsetY 表示鼠标离父元素偏移的y距离
按钮辅助的相关属性
ctrlKey 是否按下了ctrl键
shiftKey 是否按下了shift键
altKey 是否按下了alt键
//辅助的按键属性 返回布尔类型值
console.log(e.ctrlKey);//是否长按ctrl
console.log(e.altKey);//是否长按alt
console.log(e.shiftKey);//是否长按shift
鼠标相关属性
button 按下是哪个键
//按下的键是什么 三个值 0 1 2
console.log(e.button);左键0 中间滚轮1 右键2
事件及相关触发属性
type 当前的属性类型
//事件类型 返回事件名
console.log(e.type);//click
target 表示当前事件的触发对象
//触发者元素
console.log(e.target);
//加事件的元素
console.log(e.currentTarget);
键盘相关属性
key 表示当前按下的键的字符(区分大小写)
keyCode(在keydown里面 不区分大小 全部是大写的ascii码)
code(key+大写的字符)
charCode(在keypress里面才管用 他区分大小写 返回对应的ascii码)
window.onkeypress = function(){console.log(e.code);//当前的按钮按下键是哪一个 返回的是一个key+大写字母console.log(e.keyCode);//当前按下键的大写字母 ascii码console.log(e.charCode);//当前字符的ascii码 keypress里面console.log(e.key);//表示当前按下的键
}
事件委托机制(事件代理)
概述:将对应事件委托给对应的父元素,然后通过对应的e.target获取实际的触发元素进行操作。
示例
//事件委托的写法
//获取需要加事件的父元素
var ul = document.querySelector('ul')
//给ul添加事件
//给父元素添加事件
//在内部判断触发元素 e.target
//对应执行操作
ul.onclick = function(){e = e || window.event//判断当前出发元素是否为liif(e.target.tagName == 'LI'){//排他思想//把所有的li的class清除for (var item of this.children){item.className = ''}e.target.className = 'active'}
}
事件委托的运用场景
在一个父元素里面有多个子元素要添加相同的事件的时候
DOM和BOM总结及事件内容相关推荐
- DOM与BOM与Echarts
DOM与BOM与Echarts 以下内容全部整理于:黑马程序员JavaScript核心教程,前端基础教程,JS必会的DOM BOM操作 DOM DOM简介 文档对象模型(Document Object ...
- (九)JS-WEB-API(DOM、BOM、事件、Ajax、存储)【每个工程师必须熟练掌握的技能】
JS-WEB-API 提问 DOM BOM 事件 Ajax 存储 从JS基础知识到JS-WEB-API JS基础知识 JS-WEB-API DOM(Document Object Model) DOM ...
- 前端(DOM 、BOM 和 事件 )
目录 前言 一.DOM文档流 1.什么是DOM文档流 2. DOM = Document Object Model DOM文档流 3.关于DOM的小实例 4.DOM 改进 二.BOM 1.win ...
- 提升对前端的认知,不得不了解Web API的DOM和BOM
了解Web API的DOM和BOM 引言 正文 一.DOM操作 1.DOM的本质 2.DOM节点操作 (1)property形式 (2)attribute形式 3.DOM结构操作 (1)新增/插入节点 ...
- html中dom和bom,区分BOM和DOM,区分window、document、html、body
JavaScript三大组成部分 1. ECMAScript ECMAScript是JavaScript的语法标准,由ECMA(欧洲计算机厂家协会)制定的. 2. BOM BOM即浏览器对象模型(br ...
- JavaScript实战操作(DOM,BOM)
JS语法 页面文档对象模型 浏览器对象模型 JS ECMAScript DOM BOM API 应用程序编程接口,就是一个工具,以便于能轻松实现想要完成的功能 Web API Web API是浏览器提 ...
- Web APIs /APIs --DOM简述/DOM中获取元素方法/事件(含鼠标事件)/操作(含案例)
Web APIs Web APIs 和 JS 的关联性: Web APIs是 W3C 组织的标准,主要学习DOM 和 BOM Web APIs是 JS 所独有的部分 主要学习页面交互功能 Web AP ...
- 45-js操作DOM和bom操作
一.js中的DOM和BOM的基本操作 ECMAScript(核心语法): BOM(Browser Object Model 浏览器对象模型) 操作浏览器 DOM(Document Object Mod ...
- 前端复习之DOM、BOM
BOM VS DOM: 1 BOM:浏览器对象模型(API),专门操作浏览器窗口的API 2 没标准! 3 DOM:文档对象模型(API),专门操作网页内容的API 4 可以对网页中任意对象,做任意修 ...
最新文章
- linux 信号传递函数,Linux Shell之七 函数应用
- 菜鸟学习笔记2,$(document).ready()使用讨论
- html5场景编辑工具,3款容易上手的HTML5编辑工具推荐~
- mysql segmentation fault_mysql Segmentation fault的问题,求教
- 如何实现远程登陆,如何实现远程桌面
- 常见的几种RuntimeException
- 推荐一个很棒的开源工作流elsa-core
- 关于 Java 字符串的全部,都在这份手册里了
- MFC隐藏EditControl控件的光标
- ftp搜索文件_CrossFTP for Mac(FTP客户端)
- 简单的php文件_超简单的php文件上传程序
- 号外!德国惊现大罢工--要求每周上班28小时
- 计算机应用基础试卷分析报告,计算机应用基础试卷分析.pdf
- 爬虫:爬取网页表格内容,写入scv文件并绘图
- 网络端口和端口扫描简介
- 如何制作一款Chrome浏览器扩展程序
- 深度学习入门-基于python的理论与实现(五)误差反向传播法
- iOS 开发者开证书创建流程
- 2021年工业软件行业研究报告
- could not load library cudnn_ops_infer64_8.dll. Error code 126
热门文章
- 数位板光标抖动 - 解决方案
- 软件测试面试题及答案【史上最全】
- [NTT][DP][树链剖分][分治] LOJ #6289. 花朵
- 光模块正确安装步骤及注意事项【图文】
- 【Ubuntu】超详细 win10+Ubuntu16.04双系统安装(强烈推荐惠普台式机看进来)
- Cloudreve自建云盘实践,我说了没人能限制得了我的容量和速度
- 替代notepad++,notepad--介绍及插件cmake编译
- 使用MATLAB设计FIR低通滤波器
- 浏览器主页被hao123锁定怎么办?彻底删除hao123的方法
- C语言中常见的置位操作(置0或置1)