3. JavaScript
Js简介
1.js也是一门编程语言 它也是可以写后端代码的
用js一统天下 前后端都可以写
nodejs 支持js代码跑在后端服务器上
然而并不能 想的太天真了!!!
2.js跟java一毛钱关系都没有,纯粹是为了蹭当时java的热度
ECMAScript和JavaScript的关系
因此ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。
JS版本
主要还是用的5.1和6.0
JavaScript 是脚本语言
JavaScript 是一种轻量级的编程语言。
JavaScript 是可插入 HTML 页面的编程代码。
JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行。
JavaScript 很容易学习
# js的注释
"""
// 单行注释
/*
多行注释1
多行注释2
多行注释3
*/
"""
# 两种引入方式
1.script标签内部直接书写js代码
2.script标签src属性引入外部js代码
# js语法结构
js是以分号作为语句的结束
但是如果你不写分号,问题也不大 也能够正常执行 但是它就相当于没有结束符
js学习流程
- 变量
- 数据类型
- 流程控制
- 函数
- 对象
- 内置方法/模块
变量
"""
在js中 首次定义一个变量名的时候需要用关键字声明
1.关键字var
var name='jason'
2.es6推出的新语法
let name='jason'
如果你的编辑器支持的版本是5.1那么无法使用let
如果是6.0则向下兼容 var let
"""
# var与let的区别
n = 10
for n in range(5):
print(n)
print(n)
# var 5 let 10
"""
var在for循环里面定义也会影响到全局
let在局部定义只会在局部生效
js变量的命名规范
1.变量名只能是
数字 字母 下划线 $
2.变量名命名规范(不遵循也可以)
1.js中推荐使用驼峰式命名
userName
dataOfDb
2.python推荐使用下划线的方式
user_name
data_of_db
3.不能用关键字作为变量名
不需要记忆
js代码的书写位置
1.可以单独开设js文件书写
2.还可以直接在浏览器提供的console界面书写
在用浏览器书写js的时候 左上方的清空按钮只是清空当前页面 代码其实还在
如果你想要重新来 最好重新开设一个 页面
(在使用浏览器书写 你自己的js代码的时候推荐你在 自己的html页面打开)
"""
常量
# python中没有真正意义上的常量 默认全大写就是表示常量
# js中是有真正意义上的常量的
const pi = 3.14
变量
数据类型
js也是一门面向对象的编程语言,即一切皆对象
# js/python是一门拥有动态类型的语言
# 所谓动态类型,指的是变量名能够指向任意数据类型的数据,在一些语言中,变量名一旦指向了固定的数据类型,后续就不能更改
name = 'jason'
name = 123
name = [1,2,3,4]
数值类型(number)
var a = 11;
var b = 11.11;
// 如何查看当前数据类型
typeof a;
typeof b;
"number" // 返回的结果都是number,不区分是整型还是浮点型
// 特殊的NaN:数值类型:表示不是一个数字,全称是NOT A NUMBER,本身是一个数值类型
// 类型转换
parseInt() // 转换成整型
parseFloat() // 转换成浮点型
// 类型转换的几种情况:
parseInt('12312312')
12312312 //直接转换
parseFloat('11.11')
11.11 //直接转换
parseInt('11.11')
11 //只取整数部分
parseInt('123sdasdajs2312dasd')
123 //从头开始遍历,直到不是整数的时候就停止
parseInt('asdasdad123sdasdajs2312dasd')
NaN //从头开始遍历,发现不是整数直接返回NaN
字符类型(string)
var s = 'jason'
undefined
typeof s
"string"
var s1 = "jason"
undefined
typeof s1;
"string"
var s2 = '''egon''' // 支持单引号,双引号,但是不支持三引号
VM665:1 Uncaught SyntaxError: Unexpected string
// 模版字符串:不仅可以定义多行文本,还可以实现格式化字符串操作
var s3 = `
asdkajsd
sdjkladj
asdjlajdkl
`
typeof s3
"string"
// 书写${} 会自动去前面找大括号里面的变量名对应的值
var name = 'jason'
var age = 18
var sss = `
my name is ${name} and my age is ${age}
`
sss //返回的结果
"
my name is jason and my age is 18
"
var s4 = `my name is ${namemmmmm}` // 变量如果没有定义直接报错
VM1140:1 Uncaught ReferenceError: namemmmmm is not defined
at <anonymous>:1:24
// 在写js代码的时候 不要去管左侧箭头的内容
// 字符串的拼接:在python中不推荐你使用+做拼接,但是在js中推荐你直接使用+做拼接
name + age
字符类型常用方法
"""
.length 返回长度
.trim() 移除空白
.trimLeft() 移除左边的空白
.trimRight() 移除右边的空白
.charAt(n) 返回第n个字符
.concat(value, ...) 拼接
.indexOf(substring, start) 子序列位置
.substring(from, to) 根据索引获取子序列
.slice(start, end) 切片
.toLowerCase() 小写
.toUpperCase() 大写
.split(delimiter, limit) 分割
"""
// 举例:
var name1 = ' egonDSB '
undefined
name1
" egonDSB "
name1.trim()
"egonDSB"
name1.trimLeft()
"egonDSB "
name1.trimRight()
" egonDSB"
var name2 = '$$jason$$'
undefined
name2.trim('$') # 不能加括号指定去除的内容
"$$jason$$"
name2.charAt(0)
"$"
name2.indexOf('as')
3
name2.substring(0,5)
"$$jas"
name2.slice(0,5)
"$$jas"
name2.substring(0,-1) # 不识别负数
""
name2.slice(0,-1) # 可以识别负数,所以推荐使用slice
"$$jason$"
var name3 = 'eGoNDsb123666HahA'
undefined
name3.toLowerCase()
"egondsb123666haha"
name3.toUpperCase()
"EGONDSB123666HAHA"
var name = 'tank|hecha|liaomei|mengsao|...'
undefined
name.split('|')
(5) ["tank", "hecha", "liaomei", "mengsao", "..."]
name.split('|',2) # 返回两个结果
(2) ["tank", "hecha"]0: "tank"1: "hecha"length: 2__proto__: Array(0)
name.split('|',10) # 第二个参数不是限制切割字符的个数还是获取切割之后元素的个数
(5) ["tank", "hecha", "liaomei", "mengsao", "..."]
name.concat(name1,name2)
"tank|hecha|liaomei|mengsao|... egonDSB $$jason$$"
var p = 1111
undefined
name.concat(p) # js是弱类型(内部会自动转换成相同的数据类型做操作)
"tank|hecha|liaomei|mengsao|...1111"
布尔值(boolean)
"""1.在python中布尔值是首字母大写的 True False2.但是在js中布尔值是全小写的 true false# 布尔值是false的有哪些 空字符串、0、null、undefined、NaN"""
null与undefined
"""null 表示值为空 一般都是指定或者清空一个变量时使用 name = 'jason' name = nullundefined 表示声明了一个变量 但是没有做初始化操作(没有给值,但是类型可能已经被定义了) 函数没有指定返回值的时候 返回的也是undefined 参考博客图解:https://www.cnblogs.com/Dominic-Ji/p/9111021.html"""
对象
-
数组(类似于python里面的列表)
var l = [11,22,33,44,55]typeof l"object" # 对象类型var l1 = [11,'sdasd',11.11,true]l1[1]"sdasd" # 支持索引查值l1[-1] # 但是不支持负数索引var l = [111,222,333,444,555,666]undefinedl.length # 长度6l.push(777) # 尾部追加元素7l(7) [111, 222, 333, 444, 555, 666, 777]l.pop() # 删除最后一个元素777l(6) [111, 222, 333, 444, 555, 666]l.unshift(123) # 头部追加7l(7) [123, 111, 222, 333, 444, 555, 666]l.shift() # 头部删除123l.slice(0,3) # 切片,返回一个新列表(3) [111, 222, 333]l.reverse() # 反转(6) [666, 555, 444, 333, 222, 111]l.join('$') # 用法跟python刚好相反,将元素拼接在一起,形成长字符串"666$555$444$333$222$111"l.concat([111,222,333]) # 相当于python中的extend,迭代着将元素追加到列表中(9) [666, 555, 444, 333, 222, 111, 111, 222, 333]l.sort() # 排序,默认从小到大(6) [111, 222, 333, 444, 555, 666]# 三个比较重要的方法# forEach方法var ll = [111,222,333,444,555,666]ll.forEach(function(value){console.log(value)},ll)VM2277:1 111 # 一个参数就是显示数组里面每一个元素对象VM2277:1 222VM2277:1 333VM2277:1 444VM2277:1 555VM2277:1 666ll.forEach(function(value,index){console.log(value,index)},ll)VM2346:1 111 0 # 两个参数就是显示元素 + 元素索引VM2346:1 222 1VM2346:1 333 2VM2346:1 444 3VM2346:1 555 4VM2346:1 666 5undefinedll.forEach(function(value,index,arr){console.log(value,index,arr)},ll) # 三个参数就是显示元素 + 元素索引 + 元素的数据来源VM2430:1 111 0 (6) [111, 222, 333, 444, 555, 666]VM2430:1 222 1 (6) [111, 222, 333, 444, 555, 666]VM2430:1 333 2 (6) [111, 222, 333, 444, 555, 666]VM2430:1 444 3 (6) [111, 222, 333, 444, 555, 666]VM2430:1 555 4 (6) [111, 222, 333, 444, 555, 666]VM2430:1 666 5 (6) [111, 222, 333, 444, 555, 666]undefinedll.forEach(function(value,index,arr,xxx){console.log(value,index,arr,xxx)},ll) # 最多三个,剩下的参数会显示undefinedVM2532:1 111 0 (6) [111, 222, 333, 444, 555, 666] undefinedVM2532:1 222 1 (6) [111, 222, 333, 444, 555, 666] undefinedVM2532:1 333 2 (6) [111, 222, 333, 444, 555, 666] undefinedVM2532:1 444 3 (6) [111, 222, 333, 444, 555, 666] undefinedVM2532:1 555 4 (6) [111, 222, 333, 444, 555, 666] undefinedVM2532:1 666 5 (6) [111, 222, 333, 444, 555, 666] undefined# splice方法ll(6) [111, 222, 333, 444, 555, 666]ll.splice(0,3) # 两个参数 第一个是起始位置 第二个是删除的个数(3) [111, 222, 333]ll(3) [444, 555, 666]ll.splice(0,1,777) # 先删除后添加,第三个参数就是添加的新元素[444]ll(3) [777, 555, 666]ll.splice(0,1,[111,222,333,444])[777]ll(3) [Array(4), 555, 666]# map方法# 第一个参数是一个函数,map会将第二个参数的元素传递给第一个参数一一返回结果,结果还是列表var l1 = [11,22,33,44,55,66]undefinedl1.map(function(value){console.log(value)},l1)VM3115:1 11VM3115:1 22VM3115:1 33VM3115:1 44VM3115:1 55VM3115:1 66l1.map(function(value,index){return value*2},l1)(6) [22, 44, 66, 88, 110, 132]l1.map(function(value,index,arr){return value*2},l1)(6) [22, 44, 66, 88, 110, 132]
运算符
# 算术运算符var x = 10;var res1 = x++;var res2 = ++x;res1 10res2 12++表示自增1 类似于 +=1加号在前先加后赋值 加号在后先赋值后加# 比较运算符1 == '1' # 弱等于 内部自动转换成相同的数据类型比较了true 1 === '1' # 强等于 内部不做类型转换1 != '1'false1 !== '2'true# 逻辑运算符 # python中 and or not # js中 && || !5 && '5''5'# 取后面的结果0 || 11!5 && '5'false# 赋值运算符:与数学一样的= += -= *= ....
流程控制
# if判断var age = 28;# if(条件){条件成立之后指向的代码块}if (age>18){ console.log('来啊 来啊')}# if-elseif (age>18){ console.log('来啊 来啊')}else{ console.log('没钱 滚蛋')}# if-else if elseif (age<18){ console.log("培养一下")}else if(age<24){ console.log('小姐姐你好 我是你的粉丝')}else{ console.log('你是个好人')}"""在js中代码是没有缩进的 只不过我们处于python书写习惯人为的加上了而已()里面是条件{}里面是代码块"""# switch语法var num = 2;switch(num){ case 0: console.log('喝酒'); break; # 不加break 匹配到一个之后 就一直往下执行 case 1: console.log('唱歌'); break; case 2: console.log('洗脚'); break; case 3: console.log('按摩'); break; case 4: console.log('营养快线'); break; case 5: console.log('老板慢走 欢迎下次光临'); break; default: console.log('条件都没有匹配上 默认走的流程')}# for循环# 打印0-9数字for(let i=0;i<10;i++){ console.log(i)}# 题目1 循环打印出数组里面的每一个元素var l1 = [111,222,333,444,555,666]for(let i=0;i<l1.length;i++){ console.log(l1[i])}# while循环var i = 0while(i<100){ console.log(i) i++;}
三元运算符
# 三元运算符# python中三元运算符 res = 1 if 1>2 else 3# JS中三元运算 res = 1>2?1:3 条件成立取问好后面的1 不成立取冒号后面的3var res = 2>5?8:10 # 10var res = 2>5?8:(8>5?666:444) # 666"""三元运算符不要写的过于复杂 """
函数
# 在python定义函数需要用到关键字def# 在js中定义函数需要用到关键字function# 格式function 函数名(形参1,形参2,形参3...){函数体代码}# 无参函数function func1(){ console.log('hello world')}func1() # 调用 加括调用 跟python是一样的# 有参函数function func2(a,b){ console.log(a,b)}func2(1,2)func2(1,2,3,4,5,6,7,8,9) # 参数多了没关系 只要对应的数据VM3610:2 1 2undefinedfunc2(1) # 参数少了也没关系,剩下的就undefinedVM3610:2 1 undefined # 关键字argumentsfunction func2(a,b){ console.log(arguments) # 能够获取到函数接受到的所有的参数 console.log(a,b)}function func2(a,b){ if(arguments.length<2){ console.log('传少了') }else if (arguments.length>2){ console.log('传多了') }else{ console.log('正常执行') }}# 函数的返回值 使用的也是关键字returnfunction index(){ return 666}function index(){ return 666,777,888,999}res = index();999res999 # 多返回值的时候,只能拿到最后一个function index(){ return [666,777,888,999]}# js不支持解压赋值,所以会直接返回一个数组
匿名函数与箭头函数
# 匿名函数 就是没有名字function(){ console.log('哈哈哈')}var res = function(){ console.log('哈哈哈')}# 箭头函数(要了解一下) 主要用来处理简单的业务逻辑 类似于python中的匿名函数var func1 = v => v; """箭头左边的是形参 右边的是返回值"""等价于var func1 = function(v){ return v}var func2 = (arg1,arg2) => arg1+arg2等价于var func1 = function(arg1,arg2){ return arg1+arg2}
函数的全局变量与局部变量
# 跟python查找变量的顺序一致var city = "BeiJing";function f() { var city = "ShangHai"; function inner(){ var city = "ShenZhen"; console.log(city); } inner();}f(); //输出结果是?var city = "BeiJing";function Bar() { console.log(city);}function f() { var city = "ShangHai"; return Bar;}var ret = f();ret(); // 打印结果是?var city = "BeiJing";function f(){ var city = "ShangHai"; function inner(){ console.log(city); } return inner;}var ret = f();ret();
自定义对象
# 你可以看成是python中的字典 但是js中的自定义对象要比python里面的字典操作起来更加的方便# 创建自定义对象 {}"""第一种创建自定义对象的方式"""var d = {'name':'jason','age':18}typeof d"object"d['name']"jason"d.name # 比python从字典获取值更加的方便"jason"d.age18for(let i in d){ console.log(i,d[i])} # 支持for循环 暴露给外界可以直接获取的也是键"""第二种创建自定义对象的方式 需要使用关键字 new"""var d2 = new Object() # {}d2.name = 'jason'{name: "jason"}d2['age'] = 18{name: "jason", age: 18}
Date对象
let d3 = new Date()Fri May 15 2020 14:41:06 GMT+0800 (中国标准时间) d3.toLocaleString()"2020/5/15 下午2:41:06"# 也支持自己手动输入时间let d4 = new Date('2200/11/11 11:11:11')d4.toLocaleString()let d5 = new Date(1111,11,11,11,11,11)d5.toLocaleString() # 月份从0开始0-11月"1111/12/11 上午11:11:11"# 时间对象具体方法let d6 = new Date();d6.getDate() 获取日d6.getDay() 获取星期d6.getMonth() 获取月份(0-11)d6.getFullYear() 获取完整的年份d6.getHours() 获取小时d6.getMinutes() 获取分钟d6.getSeconds() 获取秒d6.getMilliseconds() 获取毫秒d6.getTime() 时间戳
JSON对象
"""在python中序列化反序列化 dumps 序列化 loads 反序列化在js中也有序列化反序列化 JSON.stringify() dumps JSON.parse() loads """let d7 = {'name':'jason','age':18}let res666 = JSON.stringify(d7)"{"name":"jason","age":18}"JSON.parse(res666){name: "jason", age: 18}
RegExp对象
"""在python中如果需要使用正则 需要借助于re模块在js中需要你创建正则对象什么都不写默认匹配undefined"""# 第一种 有点麻烦let reg1 = new RegExp('^[a-zA-Z][a-zA-Z0-9]{5,11}')# 第二种 个人推荐let reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/# 匹配内容reg1.test('egondsb')reg2.test('egondsb')# 题目 获取字符串里面所有的字母slet sss = 'egondsb dsb dsb'sss.match(/s/) # 拿到一个就停止了sss.match(/s/g) # 全局匹配 g就表示全局模式sss.match(/s/)["s", index: 5, input: "egondsb dsb dsb", groups: undefined]sss.match(/s/g)(3) ["s", "s", "s"]# 全局匹配模式吐槽点1let reg3 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/greg2.test('egondsb')reg3.test('egondsb') # 全局模式有一个lastIndex属性truereg3.test('egondsb')falsereg3.test('egondsb')truereg3.test('egondsb')false# 这是因为js的数组中有一个类似指针的东西,第一次匹配是从头开始,之后指针就停留在最后了,当你再次匹配,指针会重新回到开始,如此循环reg3.lastIndex # 查询指针的位置0reg3.test('egondsb')truereg3.lastIndex7# 吐槽点2let reg4 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/reg4.test()reg4.test() # 什么都不传 默认传的是undefinedtruereg4.test()truereg4.test(undefined)truelet reg5 = /undefined/undefinedreg5.test('jason')falsereg5.test()true
Math对象(了解)
abs(x) 返回数的绝对值。exp(x) 返回 e 的指数。floor(x) 对数进行下舍入。log(x) 返回数的自然对数(底为e)。max(x,y) 返回 x 和 y 中的最高值。min(x,y) 返回 x 和 y 中的最低值。pow(x,y) 返回 x 的 y 次幂。random() 返回 0 ~ 1 之间的随机数。round(x) 把数四舍五入为最接近的整数。sin(x) 返回数的正弦。sqrt(x) 返回数的平方根。tan(x) 返回角的正切。
BOM与DOM操作
# 截至目前为止 我们虽然已经学会了js语法 但是你会发现跟浏览器和html文件还是一点关系没有"""BOM 浏览器对象模型 Browser Object Model js代码操作浏览器DOM 文档对象模型 Document Object Model js代码操作标签"""
BOM操作
# window对象:window对象指代的就是浏览器窗口window.innerHeight 返回浏览器窗口的高度900window.innerWidth 返回浏览器窗口的宽度1680window.open('https://www.mzitu.com/','','height=400px,width=400px,top=400px,left=400px')# 新建窗口打开页面 第二个参数写空即可 第三个参数写新建的窗口的大小和位置# 扩展父子页面通信window.opener() 了解window.close() 关闭当前页面
window子对象
# netscape navigator 网景领航员(浏览器名称)window.navigator.appName # 软件名称"Netscape"window.navigator.appVersion # 软件版本"5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"window.navigator.userAgent # 用户代理:用来表示当前是否是一个浏览器"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36""""window.navigator.userAgent扩展:仿爬措施 最简单最常用的一个就是校验当前请求的发起者是否是一个浏览器 userAgent user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 如何破解该措施 在你的代码中加上上面的user-agent配置即可"""window.navigator.platform"MacIntel"# 如果是window的子对象 那么window可以省略不写 但是建议写上
history对象
window.history.back() 回退到上一页window.history.forward() 前进到下一页# 对应的就是你浏览器左上方的两个的箭头
location对象(掌握)
window.location.href # 获取当前页面的urlwindow.location.href = url # 跳转到指定的urlwindow.location.reload() # 属性页面 浏览器左上方的小圆圈 重新加载 就是刷新
弹出框
- 警告框
- 确认框
- 提示框
# 警告框alert('你不要过来啊!!!')undefined# 确认框confirm('你确定真的要这么做吗?能不能有其他方式能够满足你...')false # 在弹出的确认框中,如果你选择了取消,会返回falseconfirm('你确定真的要这么做吗?能不能有其他方式能够满足你...')true # 在弹出的确认框中,如果你选择了确认,会返回true# 提示框prompt('手牌号给我看一下','22号消费888')"来宾三位"
计时器相关
- 过一段时间之后触发(一次)
- 每隔一段时间触发一次(循环)
<script> function func1() { alert(123) } let t = setTimeout(func1,3000); // 计时器以为毫秒为单位 3秒之后自动执行func1函数 clearTimeout(t) // 取消定时任务 如果你想要清除定时任务 需要用变量指代定时任务 function func2() { alert(123) } function show(){ let t = setInterval(func2,3000); // 循环定时器,每隔3秒执行一次 function inner(){ clearInterval(t) // 清除定时器 } setTimeout(inner,9000) // 9秒之后触发 } show()</script>
DOM操作
"""DOM树的概念所有的标签都可以称之为是节点JavaScript 可以通过DOM创建动态的 HTML:JavaScript 能够改变页面中的所有 HTML 元素JavaScript 能够改变页面中的所有 HTML 属性JavaScript 能够改变页面中的所有 CSS 样式JavaScript 能够对页面中的所有事件做出反应DOM操作操作的是标签 而一个html页面上的标签有很多 1.先学如何查找标签 2.再学DOM操作标签DOM操作需要用关键字document起手"""
查找标签
-
直接查找(必须要掌握)
"""id查找类查找标签查找"""# 注意三个方法的返回值是不一样的document.getElementById('d1')<div id="d1">…</div>document.getElementsByClassName('c1')HTMLCollection [p.c1]0: p.c1length: 1__proto__: HTMLCollection document.getElementsByTagName('div')HTMLCollection(3) [div#d1, div, div, d1: div#d1] let divEle = document.getElementsByTagName('div')[1] # 可以使用索引取值divEle<div>div>div</div>"""当你用变量名指代标签对象的时候 一般情况下都推荐你书写成xxxEle divEle aEle pEle""" -
间接查找(熟悉)
let pEle = document.getElementsByClassName('c1')[0] # 注意是否需要索引取值pEle.parentElement # 拿父节点<div id="d1">"div "<div>div>div</div><p class="c1">…</p><p>div>p</p></div>pEle.parentElement.parentElement # 父节点的父节点<body>…</body>let divEle = document.getElementById('d1')divEle.children # 获取所有的子标签divEle.children[0] # 索引取值<div>div>div</div>divEle.firstElementChild # 第一个子节点<div>div>div</div>divEle.lastElementChild # 最后一个子节点<p>div>p</p>divEle.nextElementSibling # 下一个兄弟节点,也就是同级别下面第一个<div>div下面div</div>divEle.previousElementSibling # 同级别上面第一个<div>div上面的div</div>
节点操作
"""通过DOM操作动态的创建img标签并且给标签加属性最后将标签添加到文本中"""let imgEle = document.createElement('img') # 创建标签imgEle.src = '111.png' # 给标签设置默认的属性"111.png"imgEleimgEle.username = 'jason' # 自定义的属性没办法点的方式直接设置"jason"imgEle # 尽管设置了username属性,但是没有添加进去<img src="111.png">imgEle.setAttribute('username','jason') # 既可以设置自定义的属性也可以设置默认的书写undefinedimgEle<img src="111.png" username="jason">imgEle.setAttribute('title','一张图片')imgEle<img src="111.png" username="jason" title="一张图片">let divEle = document.getElementById('d1')undefineddivEle.appendChild(imgEle) # 标签内部添加元素(尾部追加)<img src="111.png" username="jason" title="一张图片">"""创建a标签设置属性设置文本添加到标签内部添加到指定的标签的上面"""let aEle = document.createElement('a')aEle<a></a>aEle.href = 'https://www.mzitu.com/'"https://www.mzitu.com/"aEle<a href="https://www.mzitu.com/"></a>aEle.innerText = '点我有你好看!' # 给标签设置文本内容"点我有你好看!"aEle<a href="https://www.mzitu.com/">点我有你好看!</a>let divEle = document.getElementById('d1')undefinedlet pEle = document.getElementById('d2')undefineddivEle.insertBefore(aEle,pEle) # 添加标签内容指定位置添加<a href="https://www.mzitu.com/">点我有你好看!</a>"""额外补充 appendChild() # 默认在尾部添加 removeChild() # 删除子标签 replaceChild() # 替换子标签 setAttribute() 设置属性 getAttribute() 获取属性 removeAttribute() 移除属性"""# innerText与innerHTMLdivEle.innerText # 获取标签内部所有的文本"div 点我有你好看!div>pdiv>span"divEle.innerHTML # 内部文本和标签都拿到"div <a href="https://www.mzitu.com/">点我有你好看!</a><p id="d2">div>p</p> <span>div>span</span> " divEle.innerText = 'heiheihei'"heiheihei"divEle.innerHTML = 'hahahaha'"hahahaha"divEle.innerText = '<h1>heiheihei</h1>' # 不识别html标签"<h1>heiheihei</h1>"divEle.innerHTML = '<h1>hahahaha</h1>' # 识别html标签"<h1>hahahaha</h1>"
获取值操作
# 获取用户数据标签内部的数据let seEle = document.getElementById('d2')seEle.value"111"seEle.value"333"let inputEle = document.getElementById('d1')inputEle.value# 如何获取用户上传的文件数据let fileEle = document.getElementById('d3')fileEle.value # 无法获取到文件数据"C:\fakepath\02_测试路由.png"fileEle.filesFileList {0: File, length: 1}0: File {name: "02_测试路由.png", lastModified: 1557043082000, lastModifiedDate: Sun May 05 2019 15:58:02 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 29580, …}length: 1__proto__: FileList fileEle.files[0] # 获取文件数据File {name: "02_测试路由.png", lastModified: 1557043082000, lastModifiedDate: Sun May 05 2019 15:58:02 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 29580, …}
class、css操作
let divEle = document.getElementById('d1')undefineddivEle.classList # 获取标签所有的类属性DOMTokenList(3) ["c1", "bg_red", "bg_green", value: "c1 bg_red bg_green"]divEle.classList.remove('bg_red') # 移除某个类属性undefineddivEle.classList.add('bg_red') # 添加类属性undefineddivEle.classList.contains('c1') # 验证是否包含某个类属性truedivEle.classList.contains('c2')falsedivEle.classList.toggle('bg_red') # 有则删除无则添加falsedivEle.classList.toggle('bg_red')true# DOM操作操作标签样式 统一先用style起手let pEle = document.getElementsByTagName('p')[0]undefinedpEle.style.color = 'red'"red"pEle.style.fontSize = '28px'"28px"pEle.style.backgroundColor = 'yellow'"yellow"pEle.style.border = '3px solid red'"3px solid red"
事件
"""达到某个事先设定的条件 自动触发的动作常用事件介绍:onclick 当用户点击某个对象时调用的事件句柄。ondblclick 当用户双击某个对象时调用的事件句柄。onfocus 元素获得焦点。 // 练习:输入框onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.onkeypress 某个键盘按键被按下并松开。onkeyup 某个键盘按键被松开。onload 一张页面或一幅图像完成加载。onmousedown 鼠标按钮被按下。onmousemove 鼠标被移动。onmouseout 鼠标从某元素移开。onmouseover 鼠标移到某元素之上。onselect 在文本框中的文本被选中时发生。onsubmit 确认按钮被点击,使用的对象是form。"""# 绑定事件的两种方式<button onclick="func1()">点我</button><button id="d1">点我</button><script> // 第一种绑定事件的方式 function func1() { alert(111) } // 第二种 let btnEle = document.getElementById('d1'); btnEle.onclick = function () { alert(222) }</script>"""script标签既可以放在head内 也可以放在body内但是通常情况下都是放在body内的最底部# 等待浏览器窗口加载完毕之后再执行代码window.onload = function () { // 第一种绑定事件的方式 function func1() { alert(111) } // 第二种 let btnEle = document.getElementById('d1'); btnEle.onclick = function () { alert(222) } }"""
原生js事件绑定
案例介绍:
-
开关灯案例
<div id="d1" class="c1 bg_red bg_green"></div> <button id="d2">变色</button> <script> let btnEle = document.getElementById('d2') let divEle = document.getElementById('d1') btnEle.onclick = function () { // 绑定点击事件 // 动态的修改div标签的类属性 divEle.classList.toggle('bg_red') } </script> -
input框获取焦点失去焦点案例
<input type="text" value="老板 去吗?" id="d1"><script> let iEle = document.getElementById('d1') // 获取焦点事件 iEle.onfocus = function () { // 将input框内部值去除 iEle.value = '' // 点value就是获取 等号赋值就是设置 } // 失去焦点事件 iEle.onblur = function () { // 给input标签重写赋值 iEle.value = '没钱 不去!' }</script> -
实时展示当前时间
<input type="text" id="d1" style="display: block;height: 50px;width: 200px"><button id="d2">开始</button><button id="d3">结束</button><script> // 先定义一个全局存储定时器的变量 let t = null let inputEle = document.getElementById('d1') let startBtnEle = document.getElementById('d2') let endBtnEle = document.getElementById('d3') // 1 访问页面之后 将访问的时间展示到input框中 // 2 动态展示当前时间 // 3 页面上加两个按钮 一个开始 一个结束 function showTime() { let currentTime = new Date(); inputEle.value = currentTime.toLocaleString() } startBtnEle.onclick = function () { // 限制定时器只能开一个 if(!t){ t = setInterval(showTime,1000) // 每点击一次就会开设一个定时器 而t只指代最后一个 } } endBtnEle.onclick = function () { clearInterval(t) // 还应该将t重置为空 t = null }</script> -
省市联动
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"></head><body><select name="" id="d1"> <option value="" selected disabled>--请选择--</option></select><select name="" id="d2"></select><script> let proEle = document.getElementById('d1') let cityEle = document.getElementById('d2') // 先模拟省市数据 data = { "河北": ["廊坊", "邯郸",'唐山'], "北京": ["朝阳区", "海淀区",'昌平区'], "山东": ["威海市", "烟台市",'临沂市'], '上海':['浦东新区','静安区','黄浦区'], '深圳':['南山区','宝安区','福田区'] }; // 选for循环获取省 for(let key in data){ // 将省信息做成一个个option标签 添加到第一个select框中 // 1 创建option标签 let opEle = document.createElement('option') // 2 设置文本 opEle.innerText = key // 3 设置value opEle.value = key // <option value="省">省</option> // 4 将创建好的option标签添加到第一个select中 proEle.appendChild(opEle) } // 文本域变化事件 change事件 proEle.onchange = function () { // 先获取到用户选择的省 let currentPro = proEle.value // 获取对应的市信息 let currentCityList = data[currentPro] // 清空市select中所有的option cityEle.innerHTML = '' // 自己加一个请选择 let ss = "<option disabled selected>请选择</option>" // let oppEle = document.createElement('option') // oppEle.innerText = '请选择' // oppEle.setAttribute('selected','selected') cityEle.innerHTML = ss // for循环所有的市 渲染到第二个select中 for (let i=0;i<currentCityList.length;i++){ let currentCity = currentCityList[i] // 1 创建option标签 let opEle = document.createElement('option') // 2 设置文本 opEle.innerText = currentCity // 3 设置value opEle.value = currentCity // <option value="省">省</option> // 4 将创建好的option标签添加到第一个select中 cityEle.appendChild(opEle) } }</script></body></html>

浙公网安备 33010602011771号