初识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. 首页

    使用<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. 删除前提示用户是否确定删除

    2. 根据学号删除学生信息

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

推荐阅读更多精彩内容