day11 DOM和BOM回顾及事件讲解(上)


内容回顾


BOM(bowser object model)浏览器对象模型

windou 窗口对象(全局的变量级函数都是属于window (global对象)

location地址栏对象(获取地址栏内容使用地址栏跳转页面)\

属性:hash,search,host,hostname,pathname,port,protocol,origin,href         

方法:assign,replace

history历史对象

属性:state, length

方法:forward ,back,go,pushState,replaceSatate

screen 屏幕对象

属性:width,height,avaiWidth,avaiHeight..

navigator导航对象

属性:usreAgent

frames窗口(window)

DOm(document object model )文档对象模型

document文档对象(整个html文档)

element  元素对象(所有的标签)

attribute 属性对象(所有的标签里面的属性)

text文本对象(显示的文本)

dom里面的知识点

空文本(换行符,制表符,空格...)也是文本节点

属性如果是自身自带的属性 可以直接点出来(input.value,img.src,a.href)如果不是就不能点出来.

dom会操作对应的html的内容,当你的html内容发生变化,那么对应的页面就会重新渲染.会造成大量的重绘和回流(后续dom操作要被舍弃(效率))

重绘和回流(回流必定重绘,但是重绘不一定会回流)

重绘对应的一个元素操作(不改变他的宽高和对应的位置 而改变其他的样式)

回流对应的元素操作(改变对应的的元素所有的内容 宽高和对应的位置都会发生变化)

事件

概述:

事件是一个异步机制.他相当于一个执行者执行--观察这观察---处理函数执行,这个流程称为事件

事件的组成

事件名(内置)

执行对象(元素对象)

处理函数(自定义函数)

观察者 (js的事件引擎)

例子

我去便利店买包华子、老板告诉我没货。我跟老板说等有货通知我。货来了老板就通知我了,我去就买

了。

分析

事件名 ---- 买华子

执行者 ---- 我

观察者 --- 老板

处理 --- 买了

示例

<button>点击</button>

button.onclick=function(){

console.log('点击了')

}

事件名 click(内置的)

执行对象button(元素对象)

处理函数 后续的函数 (自定义函数)

观察者(js引擎 ,事件引擎)

在js内书写的事件,他的观察者都是事件引擎。 我们需要关注就是前面的三个内容(事件名、执行对

象、处理函数)

事件的声明书写方式

内联模式(在标签内部)

<!-- 内联模式就是在onclick书写中设置对应的代码 -->

<button onclick="alert('你好')">点我</button>

<button onclick="fn(1)">点我</button>

<script>

function fn(arg){

alert('我是函数执行'+arg);

}

脚本模式 (在script中 常用)

//脚本模式的写法 事件名 执行对象 处理函数

var btn = document.getElementsByTagName('button')[2]

//执行对象.on+事件名 = 处理函数

btn.onclick = function(){

console.log('你好');

}

function handler(){

console.log('处理函数执行了');

}

btn.onclick = handler

内联模式和脚本模式的区别

内联模式里面的函数需要手动调用 而对应的脚本模式的处理函数自动调用

内联模式里面的函数调用的this指向window对应的脚本模式里面的处理函数的this指向当前的调用者

事件名的分类

鼠标事件(鼠标出发的mouse)

click 单击事件

dblclick 双击事件

mousedown 按下

mouseup 弹起

mouseenter 移入

mouseleave 移出

mouseover 移入

mouseout 移出

mousemove 移动

contextmenu 右键点击

注意事项

click和对应mousedown和mouseup的执行顺序(mousedown--mouseup--click)

mousenter(mouseleave)和mouseover(mouseout)的区别(mouseenter子元素不会出发 mouseover 子元素会触发)

<div>我是一个div

<p>你好</p>

</div>

<script>

//获取div

var div = document.querySelector('div')

//脚本模式 元素对象.on+事件名 = 处理函数

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按下

key up 弹起

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)

//加载事件

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的滚动栏滚动了');

}

表单的事件

submit 表单提交事件

reset 表单重置事件

select 内容被选中(只针对输入框和文本域)

change 表单的value值发生变化

input 根据里面的内容变化发生变化

blur 失去焦点

focus 获取焦点

//表单相关的事件

//加给整个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('获取焦点了');

}

相关聚焦和失焦方法

focus 聚焦方法

blur 失焦方法

//element也具备 focus() blur()

document.querySelector('input').focus()

setTimeout(function(){

document.querySelector('input').blur()

},3000)

event 事件源对象

概述

event 被称为事件源对象,他是一个全局的内置对象(属于window),他里面包含了一些关于事件执行的相关属性.

处理函数中arguments

处理函数也是一个函数,函数就具备一个arguments属性,argments是一个伪数组.那么刘可以知道对应的处理函数里面也拥有arguments

var btn = document.querySelector('button')

btn.onclick = function(){

//点击事件触发以后对应的arguments里面有一个对应的pointEvent的对象

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距离


按钮辅助的相关属性

ctrKey是否按下了ctr键

aitKey是否按下了alt键

shiftKey是否按下了shift键

/辅助的按键属性 返回布尔类型值

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 当前的事件类型

target 表示当前事件的触发对象

currentTarget 表示加事件的元素

//事件类型 返回事件名

console.log(e.type); //click

//触发者元素

console.log(e.target);

//加事件的元素

console.log(e.currentTarget);

键盘相关的属性

key 表示当前按下的键的字符(区分大小写)

keyCode (在keydown里面 不区分大小 全部是大写的ascii码)

code (key+大写的字符)

charCode (在keypress里面才管用 他区分大小写 返回对应的ascii码)

事件委托机制(事件代理)

概述:将对应的事件委托给对应的父元素,然后通过对应的e.target获取实际的触发元素进行操作。

示例

事件委托的运用场景

在一个父元素里面有多个子元素要添加相同的事件的时候

window.onkeypress = function(e){

console.log(e.code);//当前的按钮按下键是哪个一个 返回的是一个key+大写字母

console.log(e.keyCode);//当前按下键的大写字母 ascii码

console.log(e.charCode); //当前字符的ascii码 keypress里面

console.log(e.key);//表示当前按下的键 (兼容问题)

}

//事件委托的写法

//获取需要加事件的父元素

var ul = document.querySelector('ul')

//给ul添加事件

//给父元素添加事件

//在内部判断触发元素 e.target

//对应执行操作

ul.onclick = function (e) {

e = e || window.event

//判断当前触发元素是否为li

if (e.target.tagName == 'LI') {

//排他思想

//把所有的li的class清除

for (var item of this.children) {

item.className = ''

}

e.target.className = 'active'

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容