初识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. 定时器方法

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

window.setTimeout()

setTimeout(() => {

    // 跳转到新的地址栏

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

    // 刷新当前窗口

    // window.location.reload()  // 刷新

}, 5000)

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

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(number n)方法,既可以实现前进,也可以实现后退

// n为正整数时前进n次,为负整数时后退|n|次

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属性值获取所有该元素。


简单的封装一下:

// 传一个id属性值,返回一个包含所有以该参数值为id值的元素的集合对象

function $(id) {

    return document.getElementById(id)

}

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. 案例

购物车

    复选框全选(checked属性,返回复选框的状态)

    购物车+复选框全选

    点击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.构造函数定义

// 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'));

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

1. 通配符

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

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

\d 表示:数字

\D 表示:非数字

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

表示:以表示:以符号前面的第一个字符结尾

{n} 表示:重复n次

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

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

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

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

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

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

\. 表示:.字符 ^ 表示:^ \表示:表示:

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

\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页面加载事件

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

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

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

    window.onload = function() {

        alert('页面加载完成!')

    }

2. DOMContentLoaded页面加载事件

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

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

    window.addEventListener('DOMContentLoaded', function() {

        alert('页面结构加载完毕!')

    })

七、AJAX & JSON

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

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

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

1. json格式数据

// json对象

// 注意:对象的属性名,必须要双引号引起来

let obj={"name":"张三","age":20,"gender":"男"}

// json数组

let arr=[{"name":"张三","age":20,"gender":"男"},{"name":"李四","age":22,"gender":"女"}]

2. AJAX对象

// 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)

        }

    }

}

readyState读取状态

0: 请求未发送

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

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

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

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

status响应的状态码

200:成功

404:请求资源错误

500:服务器端错误

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

1. 登录页

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

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

    多个参数用&符号隔开

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

2. 首页

    使用