javascript基础
Javasript简介
JS是一门面向对象的编程语言
JS的发展史
详情请参见博客:https://www.cnblogs.com/Dominic-Ji/p/9111021.html
注释
单行注释
//单行注释
多行注释
/*
多行注释
多行注释
*/
JS代码的引入方式
第一种
script标签内部书写
第二种
引入外部js文件
JS语法格式
- js用分号作为语句的结束,但是不写也没问题
变量
如何定义变量
首次声明变量需要使用关键字,不用也不会报错
var name = 'chloe'; 声明的都是全局
let name = 'chloe'; 可以区分全局和局部
常量
在js中有真正意义的常量
const pi = 3.14
pi = 3.44; # 会报错
变量命名规范
1 变量名只能是数字 字母 下划线 $
2 命名规范,推荐使用驼峰式命名
3 变量名不能用关键字作为变量名
数据类型
数值类型(number)
js是一门动态类型的语言
动态:一个变量名可以指向任意的数据类型
静态:变量名之恶能植想一种数据类型,后续不能更改变量值
var a = 11;
var b = 11.11;
// 查看当前数据类型 typeof
typeof a; // "number"
typeof b; // "number"
// NaN:数值类型,表示的意思是不是一个数字:NOT A NUMBER
查看数据类型---typeof
let a = 11;
let b = 11.11;
typeof a;
typeof b;
数值类型
-
浮点型(parseFloat)
-
整形(parseInt)
-
NaN:表示不是一个数字,NOT A NUMBER
类型转换
- 转整形
// 字符串转整形
let a = '123';
parseInt(a); // 123
// 浮点型转整形
let a = "123.123";
parseInt(a); // 123
// 带有非数字的字符串转整形,字符转开头有数字,即可将数字类型转为整形,如果数字不在中间就会返回NaN
let e = "123asd";
parseInt(e); // 123
let f = "sf123";
parseInt(f); // NaN
- 转浮点型
// 字符串转浮点型
let a = "123.1";
parseFloat(a); // 123.1
// 整形转浮点型
let b = 123;
parseFloat(a); // 123
// 带有非数字的字符串转浮点型
let c = "123.1hahah";
parseFloat(c); // 123.1
let f = "sf123.1";
parseFloat(f); // NaN
字符类型(string)
字符串的定义
// 不支持三引号定义字符串,支持单引号和双引号
var s = 'jason' ;
var s1 = "egon";
模板字符串
// 模板字符串
var s3 = `
发达
sss
dfdsafa
`
// 模板字符串除了可以定义多行文本之外,还可以实现格式化字符串的效果
var name = 'jason';
car age = 18;
var info = `
my name is ${name} my age is ${age}
`
// ${}会自动去前面找大括号里面的变量名对应的值,如果,欸有定义会直接报错
字符串的拼接
// 字符串的拼接
python不建议使用+号拼接字符串
js推荐使用+号拼接字符串
字符类型的常用方法 --- 建议与python的字符串方法结合记忆
- 返回字符串长度,.length
let a = "hello world";
a.length;
- 移除字符串两侧的空白,.trim()
let b = " jkajdk ";
b.trim();
// 无法移除字符串两侧指定内容
let c = "**fhak**"
c.trim("*");
"**fhak**"
- .trimLeft() 移除左边的空白
var name = ' chloe ';
name.trimLeft() // "chloe "
- .trimRight() 移除右边的空白
var name = ' chloe ';
name.trimRight() // " chloe"
- .charAt(n):返回下标为n的元素
var name = 'chloe';
name.charAt(1); // h
- .concat():拼接,相当于在字符串末尾追加内容,可以是数字类型,内部会自动转换成相同的数据类型进行操作
var name = 'chloe';
name.concat('hah') // "chloehah";
- indexOf(substring):字符串内元素的位置
元素不存在返回-1
元素为1个,返回元素对应的索引值
元素为连续多个且包含在字符串内,返回小字符串的第一个元素的索引
var name = 'chloe';
name.indexOf("d");
-1
name.indexOf("o");
3
name.indexOf("oe");
3
- substring(from,to):根据索引切片,无法识别负数
var name = 'chloe';
name.substring(0,-1); // 不识别负数
- slice(start,end) 切片,可以识别负数
var name = 'chloe';
name.slice(0,-1); // "chlo"
- toLowerCase() 所有字母小写
var name = '12asDF.@';
name.toLowerCase(); // "12asdf.@"
- toUpperCase() 所有字母大写
var name = '12asDF.@';
name.toUpperCase(); // "12ASDF.@"
- .split(delimiter,limit):指定分隔符,及分割后获取的元素的个数
分隔符不存在不会报错,不会分割
var name = 'tank|egon|jason|wu sir';
// 分割后获取元素个数小于总元素个数
name.split('|',2); // (2) ["tank", "egon"]
// 分割后获取元素个数大于总元素个数,取分割后所有的元素
name.split('|',10); // (4) ["tank", "egon", "jason", "wu sir"]
布尔值(boolean)
布尔值格式
全为小写:true false
布尔值是false的数据
0 空字符串 null undefined NaN
null与defined
null
表示值为空,一般是指定或者清空一个变量时使用
可以理解为放了值,但是值被拿完了,但是留下了空的装值的盒子
var name = 'chloe';
var name = null;
undefined
表示声明了一个变量,但是没有做初始化操作没有给装值的盒子
函数没有指定返回值的时候,返回的也是undefined
对象
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...此外,JavaScript 允许自定义对象。
数组对象
- 数组(类似与python中的列表)[]表示数组
- 数组基本方法
var a = [11,'a',true];
typrof a; // "object"
// 支持索引取值,但是不支持负数索引
a[1]; // "a"
// 数组的长度:.length
a.length; // 3
// 数组中追加值
a.push('chloe');
a; // (4) [11, "a", true, "chloe"]
// 数组删除值:pop(),n不写,默认删除最后一个元素,会返回删除的元素值;
a.pop();
// unshift():头部插入元素,返回当前数组的元素个数
a.unshift('false'); // 4
a // (4) ["false", 11, "a", true]
// shift():头部移除元素,返回被移除的元素值
a.shift(); // "false"
// .slice(start,end):切片,识别负数
a.slice(0,2); // (2) [11, "a"]
// reverse():反转
a.reverse(); // (3) [true, "a", 11]
// .join():使用指定字符串拼接,内部会将数字转为字符串
var a = [true, "a", 11];
a.join(2); // "true2a211"
// concat():相当于python中列表的extend方法,返回扩展后的元组
a.concat([1,2,3]); // (6) [true, "a", 11, 1, 2, 3]
// sort():排序
var a = [2,2,4,3];
a.sort(); // (4)[2,2,3,4]
-
数组重要方法 --- forEach(function(value,index,arr){console.log(value,index,arr)})
index arr参数可以不写,如果参数超过三个会显示undefined
var a = [1,2,'a','c'];
// 只有一个value参数,显示数组中的元素值
a.forEach(function(value){console.log(value)});
/*
VM1274:2 1
VM1274:2 2
VM1274:2 a
VM1274:2 c
*/
// 两个参数value index,显示数组中的元素值及元素索引
a.forEach(function(value,index){console.log(value,index)});
VM1326:1 1 0
VM1326:1 2 1
VM1326:1 a 2
VM1326:1 c 3
// 三个参数value index arr,显示数组中的元素值及下标及元素来源
a.forEach(function(value,index,arr){console.log(value,index,arr)});
VM1340:1 1 0 (4) [1, 2, "a", "c"]
VM1340:1 2 1 (4) [1, 2, "a", "c"]
VM1340:1 a 2 (4) [1, 2, "a", "c"]
VM1340:1 c 3 (4) [1, 2, "a", "c"]
// 四个参数,value index arr xx,显示数组中的元素值及下标及该数组及undefined
a.forEach(function(value,index,arr,xx){console.log(value,index,arr,xx)});
VM1372:1 1 0 (4) [1, 2, "a", "c"] undefined
VM1372:1 2 1 (4) [1, 2, "a", "c"] undefined
VM1372:1 a 2 (4) [1, 2, "a", "c"] undefined
VM1372:1 c 3 (4) [1, 2, "a", "c"] undefined
-
数组重要方法 --- splice(start,num,data)
三个参数,第一个是起始位置,第二个是删除个数,第三个删除后添加的数据
var a = [1,2,'a','c'];
// 两个参数的情况,第一个是起始位置,第二个是删除个数,返回删除的元素
a.splice(1,1); // [2]
a; // (3) [1, "a", "c"]
// 三个参数,先删除后添加
// 删除后添加元素
a.splice(1,1,4); // [2]
a; // [1,4,'a','c']
// 删除后添加数组
a.splice(1,1,[4,5]); // [2]
a; // (4) [1, Array(2), "a", "c"]
-
数组重要方法 --- map(function(value,index,arr){return value })
对数组的元素值处理后,可以重新赋值给另一个变量,原数组不变
var a = [1,2,'a','c'];
res = a.map(function(value){return value+1}); // (4) [2, 3, "a1", "c1"]
a; // (4) [1, 2, "a", "c"]
自定义对象
可以看成是我们python中的字典 但是js中的自定义对象要比python里面的字典操作起来更加的方便
创建自定义对象的方式一:{}
// 创建自定义对象
var d = {'name':'chloe','age':18};
// 查看对象的类型
typeof d; // "object"
// 取值
d['name']; // "chloe"
d['age']; // 18
d.name; // "chloe"
d.age; // 18
// 支持for循环取值,默认取到的值也是key
for (let i in d)
{
console.log(i,d[i]);
};
/*
name chloe
age 18
*/
创建自定义对象的方式二:new
var d = new Object(); // {}
// 为对象中添加键值对的方式一
d['name'] = 'chloe';
// 添加键值对的方式二
d.age = 18;
d; // {name: "chloe", age: 18}
Date对象
let d = new Date();
d; //
Sat May 16 2020 08:38:28 GMT+0800 (中国标准时间)
// 将上述时间转换为较为方便观看的格式
d.toLocaleString(); // "2020/5/16 上午8:38:28"
// 支持手动输入时间
let d = new Date('2200/11/11 11:11:11');
d; // Tue Nov 11 2200 11:11:11 GMT+0800 (中国标准时间)
d.toLocaleString(); // "2200/11/11 上午11:11:11"
// 注意:月份是从0开始到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对象 --- 重要
序列化与反序列化:实现不同语言间的数据交互
// 序列化,stringify()---相当于python中的dumps
let j = {'name':'chloe','age':18};
let res = JSON.stringify(j);
res; // "{"name":"chloe","age":18}"
// 反序列化,parse() ----相当于python中的load
JSON.parse(res); // {name: "chloe", age: 18}
RegExp对象
在python中如果需要使用正则 需要借助于re模块
在js中需要你创建正则对象
# 第一种 有点麻烦
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')
# 题目 获取字符串里面所有的字母s
let 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"]
# 全局匹配模式吐槽点
let reg3 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/g
reg2.test('egondsb')
reg3.test('egondsb') # 全局模式有一个lastIndex属性
true
reg3.test('egondsb')
false
reg3.test('egondsb')
true
reg3.test('egondsb')
false
reg3.lastIndex
0
reg3.test('egondsb')
true
reg3.lastIndex
7
# 吐槽点二
let reg4 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/
reg4.test()
reg4.test() # 什么都不传 默认传的是undefined
true
reg4.test()
true
reg4.test(undefined)
true
let reg5 = /undefined/
undefined
reg5.test('jason')
false
reg5.test()
true
"""
总结 你在用js书写正则的时候一定要注意上述问题
一般情况下你后续也不会解除到了
"""
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) 返回角的正切。
运算符
算术运算符
++ :表示自增1,类似于 +=1
-- :与++用法一致
var x = 10;
// 先将x的值赋值给y,x在自增
var y = x++;
x; // 11
y; // 10
var x = 10;
// x先自增,然后自增后的x赋值给y
var y = ++x;
x; // 11
y; // 11
比较运算符
// == 弱等于,内部自动转换成相同的数据类型进行比较
1 == '1'; // true
// === 强等于,内部不做类型转换
1 === '1'; // false
// 案例
1 != '1'; // false
1 !== '1'; // true
逻辑运算符
短路运算的前提下:进行布尔值的且和或的运算。当运算到某一个值就得出最终结果之后,就返回哪个值。
and关系:&&
or关系:||
not关系:!
5 && '5';
'5'
0 || 1;
1
!5 && '5';
false
流程控制 --- if与switch
if语法结构
if (条件)
{
条件成立时执行的代码
}
else if(条件)
{
条件成立时执行的代码
}
...
else
{
上述条件都不成立时的代码
}
if案例
var age = 18;
if (age>18)
{
console.log('欢迎光临')
}
else if(age=18)
{
console.log('再等等')
}
else
{
console.log('未成年人禁止入内')
}
switch语法结构
提前列举好可能出现的条件和解决方式
swithch(条件)
{
case 条件:
条件成立时执行的执行代码
break;
case 条件:
条件成立时执行的执行代码
break;
case 条件:
条件成立时执行的执行代码
break;
default:
console.log('上述条件都不成立')
}
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循环
- 案例1:循环打印0-9
for(let i=0;i<10;i++)
{
console.log(i);
};
- 案例2:循环打印数组中的每一个元素
var a = [111,222,333];
for (let i=0;i<a.length;i++)
{
console.log(a[i]);
};
while循环
var i = 0;
while (i < 100)
{
console.log(i);
i++;
};
三元运算
注意:不要写的过于复杂
语法格式
var res = 条件? 条件成立时的结果:条件不成立时的结果
案例
var res = 2>5 ? 2:100 // 100
var res = 2>5 ?10:(8>5?1:2) // 1
函数
函数简介
- 关键字
在javascript中定义函数的关键字时function
- 基本语法格式
function 函数名(形参1,形参2,形参3...){函数体代码}
无参函数
function func1()
{
console.log('hello world');
};
// 调用方式与python相同,加小括号调用
func1();
有参函数
// 形参个数与实参个数相同
function func1(a,b)
{
console.log(a,b);
};
func1(1,2); // 1 2
// 实参个数大于形参个数,实参个数多了也不会报错,只要形参有对应的数据
function func1(a,b)
{
console.log(a,b);
};
func1(1,2,3,4); // 1 2
// 实参个数小于形参个数,少的形参就是undefined
function func1(a,b)
{
console.log(a,b);
};
func1(1); // 1 undefined
// arguments关键字:能够获取函数接收到的所有参数
function func1(a,b)
{
console.log(arguments);
console.log(a,b);
};
func1(1,2,3);
/*
Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
1 2
*/
//arguments简单使用
function func2(a,b){
if(arguments.length<2){
console.log('传少了')
}else if (arguments.length>2){
console.log('传多了')
}else{
console.log('正常执行')
}
}
函数的返回值 --- return
// 返回值只有一个
function index()
{
return 666;
};
res = index(); // 666
// 返回值有多个,只能拿到最后一个
function index()
{
return 666,999;
}
res = index(); // 999
// 返回值有多个的时候,想要全部的返回值,可以放在数组中
function index()
{
return [666,999];
}
res = index(); // (2) [666, 999]
// 注意:javascript不支持解压赋值
匿名函数 --- 没有函数名
function()
{
console.log('hello world');
}; // Uncaught SyntaxError: Function statements require a function name
// res相当于函数名
var res = function()
{
console.log('hello world');
};
res();
箭头函数
主要用来处理简单的业务逻辑 类似于python中的匿名函数
// 箭头左边的是形参 右边的是返回值
var func1 = v => v;
// 等价于
var func1 = function(v)
{
return v;
};
var func1 = (arg1,arg2) => arg1+arg2;
//等价于
var func1 = function(arg1,ard2)
{
retutn arg1+arg2;
}
函数的全局变量与局部变量
名称空间的查找顺序与python一致:以定义阶段为准
- 案例一
var city = "BeiJing";
function f()
{
var city = "ShangHai";
function inner()
{
var city = "ShenZhen";
console.log(city);
}
inner();
}
f(); // ShenZhen
- 案例2
var city = "BeiJing";
function Bar()
{
console.log(city);
}
function f()
{
var city = "ShangHai";
return Bar;
};
var ret = f();
ret(); // BeiJing
- 案例3
var city = "BeiJing";
function f()
{
var city = "ShangHai";
function inner()
{
console.log(city);
};
return inner;
}
var ret = f();
ret(); // ShangHai
BOM
BOM简介
浏览器对象模型 Browser Object Model
javascript代码操作浏览器
BOM操作
window对象
window对象指代的就是浏览器窗口
// 浏览器窗口的高度
window.innerHeight
//浏览器窗口的宽度
window.innerWidth
// 新建窗口打开页面
window.open('httos://https://www.cnblogs.com/Kathrine/','','height=400px,width=400px,top=400px,left=400px')
/*
第一个参数:新建窗口打开的页面的网址
第二个参数:写空即可
第三个参数:新建窗口的位置和大小
*/
// 关闭当前页面
window.close()
window子对象(window子对象的window前缀可以省略)
// 浏览器的名称
window.navigator.appName
// "Netscape"
// 浏览器版本
window.navigator.appVersion
// "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
// 表示当前是否是一个浏览器
window.navigator.userAgent;
// "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
/*
扩展:反爬措施
最简单最常用的就是校验当前请求的发起者是否是一个浏览器,就是用userAgent
破解该措施的办法:在代码中加上上面的userAgent配置即可
*/
// 查看当前浏览器运行在哪个平台上
window.navigator.platform;
// "Win32"
history对象
// 回退到上一页
window.history.back();
// 前进到下一页
window.history.forward();
location对象
// 获取当前页面的url
window.location.href;
// 跳转到指定的url
window.location.href = '目标网址';
// 刷新页面,作用相当于浏览器上的刷新功能
window.location.reload();
弹出框
- 警告框
// 语法格式
window.alert('弹出内容')
// 案例
window.alert('warning!!!')
undefined
- 确认框
// 语法格式
window.confirm('待确认内容')
// 案例
window.confirm('yes or not?')
// 点击确认返回true 点击取消返回false
- 提示框
// 语法格式
window.prompt('提示信息','默认值')
// 案例
window.prompt("是否保存密码",'yes')
// 用户输入什么就返回什么
计时器相关
- 过一段时间之后触发一次,只触发一次,setTimeout
<script>
function func() {
alert('哈哈')
}
setTimeout(func,3000) // 单位为毫秒,3s后自动执行func函数
</script>
// 取消定时任务
<script>
function func() {
alert('哈哈')
}
let t = setTimeout(func,3000) // 单位为毫秒,3s后自动执行func函数
clearTimeout(t) // 取消定时任务,需要用变量指代取消的定时任务
</script>
- 每隔一段时间触发一次,循环触发,setInterval
<script>
function func() {
alert('哈哈')
}
function show() {
let t = setInterval(func,3000); // 毫秒为单位 3秒之后自动执行func函数
function inner() {
clearInterval(t) // 清除定时器
}
setTimeout(inner,9000) // 9s后触发inner函数
}
</script>
DOM
DOM简介
文件对象模型,Document Object Model
javascript代码操作标签
DOM树的概念
所有的标签都可以称之为节点
DOM操作的用途
-
javascript可以通过DOM动态的创建HTML
-
JavaScript 能够改变页面中的所有 HTML 元素
-
JavaScript 能够改变页面中的所有 HTML 属性
-
JavaScript 能够改变页面中的所有 CSS 样式
-
JavaScript 能够对页面中的所有事件做出反应
DOM操作的简单流程
DOM操作的是标签,而一个HTML文档中的标签非常多
- 1 先知道如何查找标签
- 2 再使用DOM对标签进行操作
- 3 DOM操作需要用关键字document起手
DOM操作 --- 查找标签
代码准备
<div id="d1" class="c1">div
<p id="p1">div>p</p>
</div>
<p class="c1">
<span></span>
</p>
<p class='p1'>p</p>
id查找
document.getElementById('d1');
// <div id="d1">…</div>
类查找
docunment.getElementByClassName('c1');
// HTMLCollection [p.c1]0: p.c1length: 1__proto__: HTMLCollection
标签查找
document.getElementsByTagName('p');
// HTMLCollection(2) [p#p1, p.c1, p1: p#p1]
let divEle = document.getElementsByTagName('p')[0];
// <p class="c1">…</p>
注意
- 注意三个方法的返回值不同(类与标签查找会返回数组)
- 用变量名指代标签对象的时候,一般都书写为 标签名Ele(divEle)
间接查找
- 当前标签的父标签
document.getElementsByClassName('p1');
// HTMLCollection(2) [p.p1, p.p1]
let pEle = document.getElementsByClassName("p1")[0];
pEle;
// <p class="p1">div>p</p>
// 获取p标签的父节点
pEle.parentElement;
// <div id="d1">…</div>
- 获取当前标签的子标签
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操作 --- 节点操作
节点操作介绍
- 通过DOM操作动态创建标签
- 给标签添加属性
- 将标签添加到HTML文档中(临时的)
节点操作 --- 以img标签为例
创建标签
let imgEle = document.createElement('img');
为标签添加属性
- 添加默认属性,直接点出属性即可
imgEle.src = '111.png';
- 添加自定义属性,自定义属性无法点出属性
imgEle.setAttribute('自定义属性名','自定义属性值')
// 即可以设置自定义的属性,也可以设置默认的属性
imgEle.setAttribute('title','一张图片')
将标签添加到HTML文档中
let divEle = document.getElementByID('d1');
// 将img标签添加到div的内部,尾部追加
divEle.appendChild(imgEle)
节点操作 --- 以a标签为例
创建标签
let aEle = document.createElement('a');
为标签添加属性
aEle.href = 'https://www.baidu.com';
// 为a标签设置文本内容
aEle.innerText = '点我进入百度'
将标签添加到HTML文档中
let divEle = document.getElementById('d1');
let pEle = document.getElementByClassName('p1');
// 指定标签插入位置,将a标签插入到div内部的p标签前面
divEle.insertBefore('aEle','pEle')
修改标签的操作补充
appendChild() // 为标签添加儿子标签
removeChild() // 移除儿子标签
replaceChild() // 替换
setAttribute() 设置属性
getAttribute() 获取属性
removeAttribute() 移除属性
innerText与innerHTML
// 获取标签内所有的文本
divEle.innerText;
// 内部文本和标签都拿到
divEle.innerHTML;
// 二者区别:
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>"
DOM操作 --- 获取值操作
获取用户数据标签内部的数据
let seEle = document.getElementById('d2');
// 获取用户数据标签内部的数据
seEle.value;
获取用户上传的文件数据
let fileEle = document.getElementById('d3');
// 使用.value无法直接获取文件数据
fileEle.value;
"C:\fakepath\02_测试路由.png"
// 使用下述方式获取用户上传的文件数据
fileEle.files;
fileEle.files[0] # 获取文件数据
DOM操作 --- class操作
获取标签所有的类属性
let divEle = document.getElementById('d1');
divEle.classList;
// DOMTokenList(3) ["c1", "bg_red", "bg_green", value: "c1 bg_red bg_green"]
移除某个类属性
divEle.classList.remove('bg_red');
添加类属性
divEle.classList.add('bg_red')
验证标签是否包含某个类属性
divEle.classList.contains('c1');
// 会返回true 或者 false
魔性操作,有该属性删除,没有则添加
divEle.classList.toggle('bg_red')
false
divEle.classList.toggle('bg_red')
true
divEle.classList.toggle('bg_red')
false
divEle.classList.toggle('bg_red')
true
DOM操作 --- CSS操作
DOM操作标签样式,统一用style
let pEle = document.getElementsByTagName('p')[0]
undefined
pEle.style.color = 'red'
"red"
pEle.style.fontSize = '28px'
"28px"
pEle.style.backgroundColor = 'yellow'
"yellow"
pEle.style.border = '3px solid red'
"3px solid red"
事件
什么是事件
达到某个事先设定的条件,自动触发的动作
绑定事件的两种操作
第一种
// onclick就是鼠标点击按钮
<button onclick="func1()">点我</button>;
<script>
function func1() {
alert(111)
}
</script>
第二种
<button id="d1">点我</button>;
<script>
let btnEle = document.getElementById('d1');
btnEle.onclick = function () {
alert(222)
}
</script>
补充 --- script标签的位置
- 通常情况下都是放在body内的最底部
- script标签既可以放在head内 ,放在body内需要等待浏览器窗口加载完毕后再执行代码
window.onload = function () {
// 第一种绑定事件的方式
function func1() {
alert(111)
}
// 第二种
let btnEle = document.getElementById('d1');
btnEle.onclick = function () {
alert(222)
}
}
原生js事件绑定案例
开关灯案例
- 实现效果,两种颜色切换
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#d1 {
height: 200px;
width: 200px;
border: 3px solid black;
border-radius: 50%;
}
.green {
background: green;
}
.red {
background: deeppink;
}
</style>
</head>
<body>
<div id='d1' class=" green red">
</div>
<button id="d2">变色</button>
<script>
let btnEle = document.getElementById('d2');
let divEle = document.getElementById('d1');
btnEle.onclick = function () { // 绑定点击事件
// 动态修改div标签的类属性
divEle.classList.toggle('red')
}
</script>
</body>
input框获取焦点失去焦点案例
- 实现效果:input框获取焦点,清空框内内容,失去焦点,框内出现指定内容
<body>
username:<input type="text" value="用户名" id="i1">
<script>
// 先获得标签对象
let iEle = document.getElementById('i1');
// 为标签对象绑定事件 --- 获取焦点
iEle.onfocus = function () {
iEle.value = ''
};
// 失去焦点
iEle.onblur = function () {
iEle.value = '用户名'
}
</script>
</body>
实时展示当前时间
- 实现效果:点击开始,时间开始走,点击结束,时间暂停
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#d1 {
display: block;
height: 30px;
width:200px;
}
</style>
</head>
<body>
time:<input type="text" id="d1">
<button id="d2">开始</button>
<button id="d3">结束</button>
<script>
let t = null
let inputEle = document.getElementById('d1');
let startEle = document.getElementById('d2');
let endEle = document.getElementById('d3');
// 定义展示时间函数
function showTime() {
let currentTime = new Date();
inputEle.value = currentTime.toLocaleString()
}
// 为开始按钮绑定开始计时时间
startEle.onclick = function () {
// if判断限定计时器只能开设一个
if(!t){
t = setInterval(showTime,1000)
}
};
// 为停止按钮绑定结束计时
endEle.onclick = function () {
clearInterval(t);
// 停掉计时器后,如果不将t设为空,将无法再次启动计时器,因为计时器只有一个
t = null
}
</script>
</body>
省市联动
- 实现效果:选择省市后,后面选择该省市对应的区县
</head>
<body>
省:<select name="" id="d1">
<option value="" selected disabled>--请选择--</option>
</select>
市:<select name="" id="d2">
<option value="" selected disabled>--请选择--</option>
</select>
<script>
// 获得标签对象
let proEle = document.getElementById('d1');
let cityEle = document.getElementById('d2');
// 模拟省市数据
data = {
"河北": ["廊坊", "邯郸",'唐山'],
"北京": ["朝阳区", "海淀区",'昌平区'],
"山东": ["威海市", "烟台市",'临沂市'],
'上海':['浦东新区','静安区','黄浦区'],
'深圳':['南山区','宝安区','福田区']
};
// for循环获取省
for (let key in data) {
// 将省信息做成一个个option标签,放入select标签中
let optELe = document.createElement('option');
// 设置文本
optELe.innerText = key;
// 设置value
optELe.value = key;
// 以上两步相当于<option value=key>key</option>
//将创建你好的option标签放到省的select标签中
proEle.appendChild(optELe)
}
// 模拟市数据
// 文本域变化事件 change事件,实现的效果:选择省就出现对应的市信息
proEle.onchange = function () {
// 获取用户选择的省
let currentPro = proEle.value;
// 获取对应的市
let currentCityList = data[currentPro];
// 清空select市中的所有option
cityEle.innerHTML = '';
// for循环所有的市,放到第二个select标签中
for (let i=0;i<currentCityList.length;i++){
let currentCity = currentCityList[i];
// 创建option标签
let opEle = document.createElement('option');
// 设置文本
opEle.innerText = currentCity;
// 设置value
opEle.value = currentCity;
// 将option标签放入第二个select中
cityEle.appendChild(opEle)
}
}
</script>
</body>