03 JavaScript-DOM

一、BOM&DOM

1. BOM

BOM 是浏览器对象模型,就可以理解成是当前浏览器打开的窗口

window对象 就是 BOM

通过window对象 可以操作浏览器本身 它里面提供了一些操作当前浏览器的对象和方法

1.1. 各种弹框:

window.alert('消息框')

window.prompt('输入框')

window.confirm('确认框')

1.2. 打开和关闭窗口:

open()方法,打开新的窗口

window.open('http://baidu.com')

close()方法,关闭当前窗口

window.close()

1.3. 通用方法

window.parseInt('123') //将字符串的'123',强转为整型的123

window.parseFloat('12.12') //将字符串的'12.12',强转为浮点型的12.12

window.isNaN('abc') //判断'abc',不是数值数据,成立返回true

1.4. 定时器方法:

指定毫秒后,执行的定时器

window.setTimeout()

每隔指定的毫秒后,执行的定时器

window.setInterval()

1.5. 常用属性

location属性:

location是window对象的属性,该属性用于设置网页的地址栏

location.href属性 表示跳转,当前浏览器的地址栏发生了跳转

其实超链接标签的内部就是对location.href属性的封装

window.location.href = 'http://baidu.com'

location.reload()方法 表示刷新当前地址栏(刷新当前窗口)

window.location.reload()

history属性:

history是window对象的属性,该属性用于设置网页的浏览历史记录

forward()前进

window.history.forward()

back()后退

window.history.back()

go()方法,既可以实现前进,也可以实现后退

window.history.go(1) //前进一次

window.history.go(3) //前进三次

window.history.go(-1) //后退一次

window.history.go(-3) //后退三次

2. DOM

DOM 文档对象模型,就是当前网页里面的所有内容。

因为网页是在浏览器中显示的,整个浏览器是BOM,所以DOM其实是BOM的一部分

BOM 就是 window对象 DOM 就是 document对象

使用DOM获取网页元素:

如果该元素,是网页的必备元素,而且只能有一个,可以通过document对象直接获取。

比如:head,title,body

document.body.style.border = "1px solid #ccc"

document.title = 'helloworld'

更多的时候,我要需要获取网页中的指定元素,这就需要专门的方法来获取了。

getElementById()方法,根据元素的id属性值来获取指定的元素。

注意:如果网页中id属性值重复,只获取第一个。

getElementsByTagName()方法,根据元素的标签名获取所有该元素。

getElementsByClassName()方法,根据元素的类选择器名称获取所有该元素。

getElementsByName()方法,根据元素的name属性值获取所有该元素。

简单的封装一下:

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">function $(id){
return document.getElementById(id)
}
</pre>

querySelector()方法,根据选择器的名称返回元素,如果有多个元素,只返回第一个元素。

querySelectorAll()方法,根据选择器的名称返回所有的元素。

注意:querySelectorAll()方法,返回的是集合对象,不是数组对象。可以利用展开运算符,将集合对象转为数组对象。

转为数组对象后,就可以使用数组相关的方法了。

let divs2 = [...divs]

querySelector()和querySelectorAll()方法里面也可以写所有的css选择器。

3. 操作DOM元素的内容和样式

操作DOM的样式,有多种方式:

  1. 通过style属性直接设置

  2. 通过className属性设置类选择器

  3. 也可以通过classList属性添加多个类选择器

操作DOM的内容:

  1. innerText属性,用于获取 和 操作 DOM的文本内容。
  2. innerHTML属性,用于获取 和 操作 DOM的HTML内容。

4. 操作DOM元素的属性

获取和设置标签自带的属性(原生属性),直接点

let src = img.src //src是图片标签的原生属性

获取和设置标签自定义的属性,需要通过getAttribute()和setAttribute()方法

setAttribute()方法,设置元素的属性值,需要传两个参数(属性名和属性值)

getAttribute()方法,获取元素的属性值,只需要传一个参数(属性名)

5. 创建和删除DOM元素

createElement()方法,用于创建DOM元素

appendChild()方法,用于在当前DOM元素中添加子元素

删除元素有两种写法:

  1. 自删 remove()方法,是元素删除自己

  2. 通过父级删除子级 removeChild()方法,是删除元素里面指定的子元素

补充1:onclick是点击事件,on表示当,click表示点击

补充2:parentElement和parentNode属性,返回父级元素

二、鼠标事件

1. 鼠标事件

// 点击事件

onclick

// 双击事件

ondblclick

// 鼠标右键点击事件

oncontextmenu

// 鼠标进入事件

// onmouseover 比 onmouseenter 先执行

onmouseenter

onmouseover

// 鼠标离开事件

// onmouseout 比 onmouseleave 先执行

onmouseleave

onmouseout

注意:如果元素里面存在子元素,鼠标在元素中移动时会反复触发 onmouseover 和 onmouseout

// 鼠标移动事件

onmousemove

// 鼠标按下事件

onmousedown

// 鼠标弹起事件

onmouseup

2. 视口宽高

window.innerWidth 返回视口宽度

window.innerHeight 返回视口高度

3. 案例

  1. 购物车
  2. 复选框全选(checked属性,返回复选框的状态)
  3. 购物车+复选框全选
  4. 点击div消失

三、焦点事件&阻止默认行为

1. 焦点事件

获得焦点事件

onfocus

失去焦点事件

onblur

2. 阻止默认行为

e.preventDefault()

比如:阻止超链接跳转,阻止右键点击事件

3. 案例

  1. 拖动框效果

    dom.offsetLeft 获取元素的默认左边距

    dom.offsetTop 获取元素的默认上边距

    window.innerWidth 视口宽度

    window.innerHeight 视口高度

    dom.offsetWidth 获取元素可见宽度(width+border+padding)

    dom.offsetHeight 获取元素可见高度(height+border+padding)

    e.pageX 鼠标指针到X轴坐标

    e.pageY 鼠标指针到Y轴坐标

  2. 右键菜单

    e.target 获取具体的元素

    e.preventDefault() 阻止默认行为

  3. 选项卡

    classList.remove() 移除样式

    classList.add() 添加样式

四、键盘事件

1. 键盘事件

onkeydown 按键按下事件

onkeypress 按键产生字符事件

onkeyup 按键弹起事件

e.keyCode 返回按键码

注意:注册事件时要加on,触发时不需要on

2.案例

  1. 打字游戏
  2. 贪吃蛇

五、正则表达式

正则表达式:其实就是一种匹配规则,用于检索字符串

定义正则表达式的两种方式:1.直接定义 2.构造函数定义

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">// 1.直接定义
let reg1 = /abc/
// 2.构造函数定义
let reg2 = new RegExp('abc')
let str = '欢迎学习abc正则表达式'
// test()方法,用于检查一个字符串中,是否有满足匹配规则的字符串。
console.log(reg1.test(str));
// 其实用字符串自己的includes()方法,也能解决上面的问题
console.log(str.includes('abc'));
</pre>

那么正则表达式正则强大的地方是它可以写 通配符(拥有特殊含义的字符)

1. 通配符

\w 表示:字母、数字、下划线

\W 表示:除了字母、数字、下划线以外的字符

\d 表示:数字

\D 表示:非数字

^ 表示:以^符号后面的第一个字符开头

<math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><annotation encoding="application/x-tex">表示:以</annotation></semantics></math>表示:以符号前面的第一个字符结尾

{n} 表示:重复n次

{n,m} 表示:重复n到m次

[xyz] 表示:其中任意一个字符

  • 表示:重复前一项1次或多次 等价于 {1,}
  • 表示:重复前一项0次或多次 等价于 {0,}

? 表示:重复前一项0次或1次 等价于 {0,1}

. 表示:除了换行符以外的任意一个字符

. 表示:.字符 ^ 表示:^ <math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><annotation encoding="application/x-tex">表示:</annotation></semantics></math>表示:

可以用()将多个字符作为一个整体

\w 等价于 [0-9a-zA-Z_]

| 表示:或者

[\u4E00-\u9FA5] 是常用汉字的unicode编码范围

2. 使用正则表达式验证表单

验证学生的信息

3. 正则表达式配合字符串的方法

  1. replace()方法

    默认情况下,replace()方法,只会替换字符串中匹配的第一段内容

    使用正则表达式,添加全局匹配修饰符g,可以替换匹配全部内容

    使用正则表达式,添加忽略大小写修饰符i,在匹配内容时会忽略大小写

  2. search()方法

    可以通过正则表达式查找位置

六、事件其他

1. 阻止事件冒泡

默认情况下,触发子元素的事件时,会同时触发父元素相同的事件,这就叫做事件冒泡

e.stopPropagation() 阻止事件冒泡

e.preventDefault() 取消默认行为

2. 添加事件的几种方式

  1. 在元素中通过onXXX定义事件,指定一个事件方法
  2. 先获取元素,再给元素绑定事件
  3. 通过addEventListener方法,给元素注册事件,传递两个参数:事件名和事件方法
  4. 通过removeEventListener方法,移除指定的事件方法,传递两个参数:事件名和事件方法

3. 页面的加载事件

  1. window.onload页面加载事件

页面的加载事件,该事件会在页面中的所有内容都加载完毕后执行

注意:所有内容包括:标签结构,样式文件,图片文件,音频文件,视频文件...

如果网页内容过大,会导致该事件延迟执行

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">window.onload = function(){
alert('页面加载完成!')
}
</pre>

  1. DOMContentLoaded页面加载事件

只要页面中的DOM结构加载完毕后,就会立即执行

注意:该事件只能采用事件监听的方式添加,没有提供快捷方式

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">window.addEventListener('DOMContentLoaded',function(){
alert('页面结构加载完毕!')
})
</pre>

七、AJAX & JSON

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)

AJAX技术 不需要刷新页面的情况下,就可以产生局部刷新的效果

最初AJAX技术操作的是XML标签,现在绝大多数情况下操作的是JSON格式的字符串

1. json格式数据

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">// json对象
// 注意:对象的属性名,必须要双引号引起来
let obj = {
"name": "张三",
"age": 20,
"gender": "男"
}
// json数组
let arr = [
{
"name": "张三",
"age": 20,
"gender": "男"
},
{
"name": "李四",
"age": 22,
"gender": "女"
}
]
</pre>

2. AJAX对象

<pre data-role="codeBlock" data-info="js" class="language-javascript" style="padding: 0.8em; overflow: auto; line-height: 1.4; border: rgb(214, 214, 214); border-radius: 3px; font-size: 0.85em !important; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); background: rgb(245, 245, 245); font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 8; hyphens: none;">// 01.创建xhr对象 (原生ajax对象)
let xhr = new XMLHttpRequest()
// 02.初始化请求(GET请求,POST请求)
// 第一个参数是请求方式:比如GET,第二个参数是请求地址:比如192.168.11.12:81/Server/List
xhr.open('GET','./data/koubei.json')
// 03.发送请求
xhr.send()
// 04.监听读取状态改变事件
xhr.onreadystatechange = function(){
// 请求已经完成
if(xhr.readyState===4){
// 请求状态为成功
if(xhr.status === 200){
// xhr.responseText 返回响应体,它是一个json格式的字符串
// 我们需要将该字符串转为js对象
let data = JSON.parse(xhr.responseText)
}
}
}
</pre>

readyState 是读取状态:

0: 请求未发送

1:服务器连接已建立(请求已经发送)

2:请求已接收(服务器已经接收到该请求)

3:请求处理中(服务器正则准备你要的数据)

4:请求已完成,且响应已就绪

status 是响应的状态码:

200:成功

404:请求资源错误

500:服务器端错误

3. 开始搭建学生管理系统

  1. 登录页

    GET请求方式的参数,直接拼接在url里面

    ?后面的内容是请求参数,就好比是在调用一个带参数的方法一样,需要传参数

    多个参数用&符号隔开

    登录成功后,跳转到首页:location.href = './index.html'

  2. 首页

    使用<iframe>嵌入外部页面

    查询全部学生信息

八、学生管理系统

1. 查询学生信息+筛选+分页

封装一个通用方法:function loadData(studentName,sex,pageIndex,pageSize)

2. 添加学生

将对象里面的数据,转为json字符串

JSON.stringify(对象)

将对象里面的数据,转为url字符串,写一个方法进行转换

studentNo=12345&loginPwd=123123&studentName=周杰伦

设置请求头:

  1. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
  2. xhr.setRequestHeader('Content-Type','application/json')

3.修改学生

  1. 先根据学号查询指定学生
  2. 再修改该学生信息

4.删除学生

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

推荐阅读更多精彩内容