Blogger Information
Blog 37
fans 0
comment 1
visits 28490
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS基础要点
kong
Original
500 people have browsed it

css

Grid布局 二维布局:可在水平垂直两个方向上同时布局

1.栅格布局

1.1. 容器

  1. display: grid/inline-grid: 容器类型(块状或者行内)
    1.1: 属性
    grid: 块状
    grid-inline-grid: 行内

  2. grid-template-row/columns: 创建显式网格(列/行)
    2.1: 属性
    repeat:重复
    grid-template-columns: repeat(1fr 1fr)
    grid-template-row: repeat(1fr 1fr)

  3. grid-auto-row/columns: 创建隐式网格
  4. grid-auto-flow: 项目排列方向
  5. gap: 行列间隙
  6. place-content: 项目在容器中的排列方式
  7. place-items: 项目在单元格中的排列方式

2.项目

  1. grid-row/colums: 某项占据的网格区域
  2. grid-area: 是grid-row/column的语法糖
  3. place-self: 某项在单元格中的排列方式

更多:https://developer.mozilla.org/zh-CN/docs/web/CSS/CSS_Grid_Layout

2.媒体查询 @media (min-width: 大于) (max-width: 小于) (min-width: 小于) and (max-width: 大于)

2.移动端rem vw

公式: font-size: calc(100vw / 3.75); //100px;

javascript

1. 代码成员

  1. 数据:
    变量 let,储存数据和表示数据的标识符,可以在程序中被改变
    常量 const,一旦赋值就不能被改变了。

  2. 命名规则
    驼峰命名(大,小) UserName (大) userName(小)
    蛇形命名(大,小)user_name(小) APP_PHP(大)

2. 函数

1. 函数

  1. function(){
  2. //...
  3. }

2. 匿名函数

  1. let item = function(){
  2. ...
  3. }

3. 箭头函数

  1. (参数),没有参数可以留空
  2. let item = () => {
  3. //...
  4. }

4. 立即执行函数

  1. ;(function(){
  2. //..
  3. })();
  4. //或者
  5. ;(()=>{
  6. //语法糖
  7. })();

3. 引用类型

基本类型: number string boolean null undefined

引用类型:object array function

1. 数组

  1. let arr = ['1','2','3','4']
  2. console.log(arr)

2. 对象

  1. let arr = {
  2. 'name':'小明',
  3. 'age':'15'
  4. }
  5. console.log(arr)

3. 多维数组,对象数组,“类”数组

  1. //多维数组
  2. let arr = [['1',2,'你好'],['1',2,'小明']]
  3. console.log(arr[0][1] //2);
  4. //对象数组
  5. let arr = [
  6. {
  7. 'name':'小明',
  8. 'age': '15',
  9. 'sex':'男'
  10. },
  11. {
  12. 'name':'小明红',
  13. 'age': '15',
  14. 'sex':'女'
  15. }]
  16. console.log(arr[0].name //小明);
  17. //“类”数组
  18. let item = {
  19. 'name':'小明红',
  20. 'age': '15',
  21. 'sex':'女'
  22. }
  23. //对象使用 Array.from() 转换成数组
  24. arr = Array.form(item)
  25. consloe.log(arr)//数组
  26. //对象使用forEach()遍历输出数据
  27. arr.forEach(item => console.log(item))
  28. consloe.log(arr)//对象

4. 作用域

1. 作用域(用来查询变量)

2. 作用域链(由内向外查找)

3. 类型:块作用域,函数作用域,全局作用域

  1. //块作用域
  2. {
  3. let name = '小明';
  4. console.log(name)
  5. }
  6. //函数作用域
  7. let site = '墨子';
  8. const arr = function(){
  9. site = '鲁班大师'
  10. console.log(site) //'鲁班大师'
  11. }
  12. console.log(arr) //'鲁班大师'
  13. //全局作用域
  14. let site = '墨子'; // 在全局中生成变量

5.对象成员的简化语法

  1. //键值和属性一样可以简写
  2. let name = '墨子';
  3. let age = 18;
  4. const obj = {
  5. name,
  6. age
  7. }
  8. conosle.log(obj)

6.流程控制语句

1.分支

  1. if(true){
  2. //...
  3. console.log('hello')
  4. }

2.双分支

  1. if(true){
  2. console.log('hello')
  3. }else{
  4. console.log('你好')
  5. }

3.多分支

  1. let name = '墨子';
  2. if(name = '墨子'){
  3. console.log('hello')
  4. }else if(name = '鲁班大师'){
  5. console.log('你好')
  6. }else{
  7. console.log('嘿嘿')
  8. }

4.双分支语法糖(简化抒写)

三元运算符

//条件?true : false
let name = true;
console.log(name ? ‘墨子’: ‘鲁班大师’)

5.多分支语法糖(简化抒写)

等值判断

  1. let name = '墨子';
  2. switch(name){
  3. case '鲁班大师':
  4. console.log('1');
  5. break;
  6. case '墨子':
  7. console.log('2');
  8. break;
  9. default:
  10. console.log('甄姬')
  11. }

范围判断

传入true才可以执行
switch(true)

  1. let name = 80;
  2. switch(true){
  3. case name>70 && name < 100:
  4. console.log('80');
  5. break;
  6. case name>60 && name < 80:
  7. console.log('70');
  8. break;
  9. default:
  10. console.log('60')
  11. }

6.循环

while

  1. consot arr = [1,2,3];
  2. let index = 0;
  3. while(index < arr.length){
  4. console.log(arr[index])
  5. }

for

  1. consot arr = [1,2,3];
  2. for(let index = 0; index < arr.length; i++){
  3. console.log(arr[i])
  4. }

for-of (数组循环)

  1. consot arr = [1,2,3];
  2. for(value of arr){
  3. console.log(value) //1,2,3
  4. }

for-in (对象循环)

  1. consot arr = {name: '小马', age:'18', sex: '男'};
  2. for(index in arr){
  3. console.log(arr[index]) //小马,18,男
  4. }

forEach/map

forEach() 没有返回值

  1. const arr = ['小马', 18,'男'];
  2. arr.forEach(function(item,index,arr){
  3. console.log(item)
  4. });
  5. //简化
  6. arr.forEach(item => console.log(item))

map() 有返回值

  1. const arr = ['小马', 18,'男'];
  2. const res = arr.map(item => console.log(item));
  3. const res = arr.map((item,index,arr) =>
  4. `<span> ${index}: ${item} </span>\n`
  5. ).join('');
  6. const bos = document.querySelector('body');
  7. bos.innerHTML+=res
  8. console.log(res);

函数参数与返回值

参数

参数不足:默认参数

  1. //参数不足的时候
  2. let fn = function(a,b = 0){
  3. return a+b
  4. }
  5. console.log(fn(1))

参数过多:剩余参数

  1. fn = (a,b,...arr){
  2. //展开函数
  3. //第一种
  4. //创建一个数组
  5. let tmp = [a,b,...arr];
  6. let res = 0; //初始值
  7. tmp.forEach(item =>{
  8. res += item
  9. return res;
  10. })
  11. }
  12. //第一个函数参数输出
  13. fn(1,2,3,4) //10
  14. fn = (a,b,...arr){
  15. //展开函数
  16. //第二种
  17. //解析解构:将集合中的每一个成员,赋值给一个个独立的变量
  18. let [c,d,e] = arr;
  19. let data = [a,b,c,d,e];
  20. //数组的reduce方法进行求和
  21. return = data.reduce((prev,curr) => prev+curr,0)
  22. }
  23. //第一个函数参数输出
  24. fn(1,2,3,4) //10

返回值

单值:return

多值: 数组,对象

  1. //查询一个数组对象数据
  2. const items = [
  3. {id: 1,name: '西瓜', price: 20},
  4. {id: 2,name: '苹果', price: 30},
  5. {id: 3,name: '橘子', price: 40},
  6. {id: 4,name: '香蕉', price: 50},
  7. ];
  8. const getFruits = ((item, ...num) => {
  9. //先建一个返回数组
  10. let res = [];
  11. //循环num的个数
  12. for(let i = 0; i < num.length; i++){
  13. //循环出items的数据
  14. items.forEach(item => {
  15. //判断id和num的值是否相同,相同的话追加在res数组中
  16. if(item.id === num[i]){
  17. res.push(item)
  18. }
  19. })
  20. }
  21. return res
  22. })
  23. let result = getFruits(items,3,4) //{id: 3,name: '橘子', price: 40},{id: 4,name: '香蕉', price: 50}

模板字面量

多行字符串

  1. const arr = ['小明','男','18']
  2. let res = `
  3. <ul>
  4. <li>姓名:${arr[0]}</li>
  5. <li>性别:${arr[1]}</li>
  6. <li>年龄:${arr[2]}</li>
  7. </ul>
  8. `
  9. console.log(res)

解析字符串模板中的变量或表达式

解构赋值

数组解构

  1. let arr = [100,200];
  2. //左侧为模板 数组用[...] 对象用{...}
  3. //右侧为值
  4. //创建
  5. let [a,b] = arr;
  6. //更新值
  7. ;[a,b] = [300,500];
  8. console.log(a,b) //更新值 300,500
  9. //如果变量>值:使用默认值
  10. ;[a,b,c = 600] = [300,500];
  11. console.log(a,b,c) //300,500,600
  12. //变量<值:使用剩余参数 ...res
  13. ;[a,b,...arr] = [300,500,400,500];
  14. let [c,d] = arr;
  15. console.log(a,b,...arr) //300,500,400,500

对象解构

  1. //属性名有冲突的时候可以使用 uname(旧值): name(新值)
  2. let {uname: name,age} = {uname: '小明',age: 18, sex: '男'};
  3. console.log(uname,age)

应用场景1.对象克隆

  1. let user = {uname: '小明',age: 18, sex: '男'};
  2. let {...obj} = user;
  3. //克隆以后和之前的对象并不相等
  4. console.log(obj)

应用场景2. 简化传参

  1. let user = {uname: '小明',age: 18, sex: '男'};
  2. //原始传参
  3. let show = (user => {
  4. return `名字:${user.uname},年龄:${user.age}`
  5. })
  6. console.log(show(user)) // 名字:小明,年龄:18
  7. //简化对象传参
  8. let show = (({uname,age})=>{
  9. return `名字:${uname},年龄:${age}`
  10. });
  11. console.log(show(user))

访问器属性

  1. let res = {
  2. data: {
  3. age: 18
  4. },
  5. //getter: 读取 getAge => 语法糖 get age
  6. get age(){
  7. return this.data.age;
  8. },
  9. //setter: 设置 setAge => 语法糖 set age
  10. set age(age){
  11. //通过加一些条件判断 能否访问属性
  12. if(age < 18){
  13. console.log('没有成年')
  14. return false;
  15. }
  16. this.data.age = age; //通过判断进行处理
  17. }
  18. }
  19. //修改属性值
  20. res.age = 15
  21. //执行
  22. console.log(res.age) //没有成年

字符串常用方法

1. str.length :字符串长度

2. str.search('查找的值') : 字符串索引 从0开始

3. str.replace('原值','替换的值') : 字符串替换

4. str.slice(开始,结束) : 起始索引,结束索引

5. str.substr() : 起始值和获取的数量,不需要知道到哪结束

6. str.split() : 字符串 => 数组

7. str.join() : 数组 => 字符串

7. toLowerCase() /toUpperCase(): 转换字母大写/小写

数组的常用方法

1. push/pop :尾部添加/删除

  1. let arr = [];
  2. arr.push('a') //在尾部添加返回数组的数量并不返回具体的值
  3. arr.pop() //从尾部开始删除并且返回删除的值

2. unshift/shift :头部添加/删除

  1. let arr = [];
  2. arr.unshift('a') //在尾部添加返回数组的数量并不返回具体的值
  3. arr.shift() //从尾部开始删除并且返回删除的值

3. delete :删除任意数组,删除后还会有空白占位符,需要使用filter()过滤方法

  1. let arr = [1,2,3];
  2. delete arr[1]

4. filter() : 过数组方法

  1. let arr = [1,2,3];
  2. delete arr[1]
  3. arr.filter(item => item);
  4. console.log(arr) //[1,3]

键 值 键值对

keys()键值对方法
console.log(arr.keys())
返回一个迭代对象,使用for-of 遍历对象

  1. let arr = ['小明','男','18'];
  2. //获取键 arr.keys()
  3. for(item of arr.keys()){
  4. console.log(item);
  5. }
  6. //获取值 value
  7. for(item of arr.values()){
  8. console.log(item);
  9. }
  10. //键值对 [key,value]
  11. for(item of arr.entries()){
  12. console.log(item);
  13. }

获取子元素splice

数组的增删改
splice(‘起始位置’,’删除数量’,’附加元素(可选)’);

  1. let arr = ['小明','男','18'];
  2. //删除
  3. console.log(arr.splice(0,2)); // ['男'] 被删除后返回组成的数组
  4. //添加
  5. console.log(arr.splice(1,0,'111'));//数量为0 表示不删除,在当前索引后添加新元素
  6. //更新
  7. console.log(arr.splice(1,1,'五班'));//数量为1 表示在索引1删除1个值后再添加'五班'

排序

sort()
排序模板: a-b 从小到大, b-a从大到小
arr.sort(function(a,b){
retrun a-b
});

  1. let arr = [1,25,163,154,12]
  2. arr.sort((a,b) => a-b) // 从小到大排序
  3. arr.sort((a,b) => b-a) //从大到小排序

数组拼接

let a =[1,1,1,1,]
let b = [2,2,2,2,2]
let c = [3,3,3,3,3]
let d = […a,…b,…c]

数组回调方法

回调函数

  1. //同步回调函数
  2. function add(a,b){
  3. return a + b
  4. }
  5. function sum(a,b,callback){
  6. return callback(a,b)
  7. }
  8. let res = sum(10,50,function(a,b){
  9. return add(a,b)
  10. });
  11. console.log(res)

遍历 forEach / map

  1. let arr = ['小明','18','三班','五年级'];
  2. arr.forEach(item=>item)//没有返回值
  3. arr.map(item=>item) //有返回值

断言 every / some

every(callback) //返回值是布尔值 所有值都满足条件才会返回true
some(callback) // 只要满足一个条件就可以返回true

  1. let arr = [15,8,59,66,3];
  2. arr.every(item => item > 10) //false
  3. arr.some(item => item > 10) //true

过滤 filter / find…

  1. let arr = [15,8,59,66,3];
  2. //filter(callback) //过滤符合的值,并且返回新的数组
  3. arr.filter(item => item > 10) //[15,59,66]
  4. //find(callback) // 返回新数组的第一个值
  5. arr.find(item => item > 10) //15
  6. //findLast(callback) //返回新数组最后一个值
  7. arr.findLast(item => item > 10) //66
  8. //findIndex(callback) //返回新数组第一个索引值
  9. arr.findIndex(item => item > 10) //0
  10. //findeLastOf(callback) //返回新数组最后一个索引值
  11. //lastIndexOf获取最后一个索引值,分两步
  12. //1. 先过滤获取最后一个值
  13. let res = arr.findLast(item => item > 10) //66
  14. //2. 获取当前索引值
  15. arr.lastIndexOf(res) //3

累加 reduce

语法:
reduce(function(前一个值,当前值),{

最终的累加结果,由前一个值返回
}起始值)

  1. //reduce(callback,init)
  2. arr.reduce((prev,curr)=>prev+curr)
  3. //解析
  4. let res = arr.reduce(fucntion(prev,curr){
  5. return prev + curr;
  6. // prev = 1, curr = 2, prev = 3
  7. // prev = 3, curr = 3, prev = 6
  8. // prev = 6, curr = 4, ...
  9. })
  10. console.log(res)

构造函数与类

声明

class

属性

constructor()

方法

method(){} 简写

访问器

get method() / set method()

静态成员

static 关键字

继承

extends / super

  1. //构建函数
  2. class User{
  3. //属性
  4. constructor(name){
  5. this.name = name
  6. }
  7. //方法
  8. say(){
  9. return `${this.name}`
  10. }
  11. //静态
  12. static age = '15'
  13. }
  14. let res = new User('小马')
  15. console.log(res.say())
  16. //继承
  17. class Child extends User{
  18. constructor(name,email){
  19. super(name)
  20. this.email = email
  21. }
  22. speak(){
  23. return `${this.name}:${this.email}`
  24. }
  25. }
  26. let resChild = new Child('小刘','123@qq.com')
  27. console.log(resChild.speak())//小刘 123@qq.com

DOM操作

获取DOM元素

  1. <div class="box"> <1> </div>
  2. <div class="box">2</div>
  3. <div class="box">3</div>
  4. <div class="box">4</div>
  5. <div class="box">5</div>

一组 querySelectorAll()

  1. let item = document.querySelectorAll('.box');
  2. console.log(item)

一个 querySelector()

  1. let item = document.querySelector('.box');
  2. console.log(item)

表单元素获取

关键字forms

关键字 forms 使用name值和id值都可以获取到

  1. <form action="" id="form">
  2. <input type="email" value="123@qq.com" name="email" /><br />
  3. <input type="text" value="小刘" name="uname" /><br />
  4. <input type="password" name="password" value="20230926" />
  5. </form>
  1. const form = document.forms.form;
  2. const email = form.email.value
  3. const password = form.password.value
  4. console.log(password)

let forms = document.forms.ID(表单的ID)
获取表单组件方法forms.email

数据封装

  1. let data = {
  2. uname,age
  3. }
  4. data = JSON.stringify(data,null,4)
  5. console.log(data)

DOM节点转为数组

遍历DOM

  1. children: 元素类型子节点
  2. firstElementChild: 第一个子元素
  3. lastElementChild: 最后一个子元素
  4. nextElementSibling: 下一个兄弟元素
  5. previousElementSibling: 前一个兄弟元素
  6. parentElement: 父元素
  7. contains(): 判断是否是后代元素返回 true/false
  1. <ul class="box">
  2. <li>item1</li>
  3. <li>item2</li>
  4. <li>item3</li>
  5. <li>item4</li>
  6. <li>item5</li>
  7. </ul>
  1. // 获取元素
  2. let list = document.querySelector('.box');
  3. //获取元素下的子元素
  4. let item = list.children
  5. //获取第一个子元素
  6. item = item.firstElementChild
  7. //获取最后一个子元素
  8. item = item.lastElementChild
  9. //获取下一个兄弟元素
  10. item = item.nextElementSibling
  11. //获取前一个兄弟元素
  12. item = item.previousElementSibling
  13. //获取子元素的父元素
  14. list = item.parentElement
  15. //判断是否是父元素的后代 返回true/false
  16. list.contains(item)

DOM增删改

创建元素

createElement()

追加元素

append()

创建片断

createDocumentFragment()

后面添加

after()

前面添加

before()

克隆节点

coneNode(true): true深度克隆的到内部所有的后代元素

替换子元素

replaceChild(新节点,旧节点)

删除元素

remove()

  1. //创建元素
  2. let ul = document.createElement('ul');
  3. //追加在body中
  4. document.body.append(ul)
  5. //追加元素
  6. ul.append('<li>追加元素</li>');
  7. //创建文档片段(可以理解为把所有新建的元素统一追加在片段中后,再由片段追加在容器中)
  8. let list = document.createDocumentFragment();
  9. //创建新元素
  10. let p1 = document.createElement('p')
  11. //新元素赋值
  12. p1.textContent = 'Paragraph 1'
  13. //将创建的新元素添加到文档片段中
  14. list.append(p1);
  15. //把文档片段插入容器中
  16. ul.appendChild(list);
  17. //在元素后追加
  18. let box = document.querySelector('.box');
  19. box.after('在box后面追加');
  20. //在元素前面追加
  21. box.before('在box前面追加');
  22. //克隆节点cloneNode(true)为true时候深入克隆所有的后代元素
  23. let cone = ul.cloneNode(true);
  24. //替换元素(元素必须是节点才可以替换)
  25. let newText = box.lastElementChild
  26. let boxFri = box.firstElementChild
  27. box.replaceChild(newText, boxFri)
  28. //删除
  29. newText.nextElementSibling.remove();

元素内容

  1. textContent: 全部内容(js,css,隐藏内容)
  2. innerText: 返回已经渲染(可见)内容
  3. innerHTML: 返回子元素的HTML内容(html)
  4. outerHTML: 返回整个元素以及所有的子元素的HTML标记(html)
  1. let box = document.querySelector('.box');
  2. //显示全部内容包含样式与已经隐藏了内容 并且可以更改
  3. box.textContent
  4. //返回已经解析后的(可见)内容 并且可以更改
  5. box.innerText
  6. //返回元素里的子元素HTML内容 并且可以更改
  7. box.innerHTML
  8. //返回整个元素以及所有子元素的HTML 并且可以更改
  9. box.outerHTML

指定位置添加元素

插入位置配合着API方法使用

  1. beforebegin: 元素自身的前面
  2. afterbegin: 插入元素内部的第一个子节点之前
  3. beforeend: 插入元素内部的最后一个子节点之后
  4. afterend: 元素自身的后面

API方法

  1. insertAdjacentElement(): 指定位置插入元素
  2. insertAdjacentText(): 指定位置插入文本节点
  3. insertAdjacentHTML: 指定位置插入元素节点
  1. //指定位置插入
  2. // let box = document.querySelector('.box');
  3. //指定位置插入必须是元素节点
  4. // box.insertAdjacentElement('beforebegin','111')
  5. //指定位置插入是HTML元素节点
  6. // box.insertAdjacentHTML('beforebegin','111')
  7. //指定位置插入是文本
  8. // box.insertAdjacentText('beforebegin','111')
  9. //创建节点
  10. let h3 = document.createElement('h3');
  11. // 元素自身的前面
  12. h3.append('111');
  13. // 在元素自身的前面插入元素
  14. // box.insertAdjacentElement('beforebegin',h3)
  15. // 在元素自身的后面插入元素
  16. // box.insertAdjacentElement('beforeend',h3)
  17. // 在元素内部第一个子节点插入元素
  18. // box.insertAdjacentElement('afterbegin',h3)
  19. // 在元素内部最后一个子节点插入元素
  20. // box.insertAdjacentElement('afterend',h3)
  21. let h2 = `<h2>标题</h2>`
  22. //方法同上
  23. box.insertAdjacentHTML('beforebegin',h2)
  24. box.insertAdjacentHTML('beforeend',h2)
  25. box.insertAdjacentHTML('afterbegin',h2)
  26. box.insertAdjacentHTML('afterend',h2)
  27. let text = '文本'
  28. box.insertAdjacentText('beforebegin',text)
  29. box.insertAdjacentText('beforeend',text)
  30. box.insertAdjacentText('afterbegin',text)
  31. box.insertAdjacentText('afterend',text)

小案例留言

  1. <input
  2. type="text"
  3. style="height: 25px"
  4. autofocus
  5. onkeydown="submit(this)"
  6. placeholder="输入留言"
  7. />
  8. <ul class="list"></ul>
  1. function submit(eve){
  2. //值不能为空
  3. if(eve.value.length === 0){
  4. alert('不能为空!')
  5. return false;
  6. }else{
  7. //获取容器
  8. const ul = document.querySelector(".list");
  9. //先把值传到新建的节点<li>中,然后插入在ul容器中afterbegin容器的第一个元素,并且添加删除按钮与事件
  10. ul.insertAdjacentHTML("afterbegin",`<li>${eve.value}<button onclick="del(this.parentElement)">删除</button></li>`);
  11. }
  12. //删除事件
  13. function del(eve) {
  14. return confirm('是否直接删除') ? eve.remove(): false;
  15. }
  16. }

dataset对象

dataset: 读取自定义属性 data-自定义属性前缀

  1. <div class="divbox" data-name-user="小刘">
  2. 20231009
  3. </div>
  1. let divbox = document.querySelector('.divbox');
  2. divbox.dataset.nameUser = '小明1'
  3. console.log(divbox.dataset.nameUser) //小明

getComputedStyle计算样式

  1. <style>
  2. .divbox{
  3. width: 100px;
  4. height: 100px;
  5. background-color: darkcyan;
  6. color: #fff;
  7. }
  8. </style>
  9. <div class="divbox" data-name-user="小刘">
  10. 20231009
  11. </div>
  1. //获取元素
  2. let divbox = document.querySelector('.divbox');
  3. //获取width的值,返回字符串
  4. let width = window.getComputedStyle(divbox).width
  5. //设置行内样式
  6. width = parseInt(width) + 100+'px'
  7. divbox.style.width = width

classList对象

classList: 对元素上的class进行增删改查

  1. classList.add(): 添加 可以连续添加(‘a’,’b’)
    如果有数组形式的添加,可使用…arr方式展开数组
  2. classList.contains(): 判断是否包含类名 返回true/false
  3. classList.replace(): 替换(旧值,新值)
  4. classList.remove(): 移除
  5. classList.toggle(): 如果类名存在就删除,如果不存在就添加

事件的添加与删除

事件属性

事件方法中如果使用到了 this 千万不要使用箭头函数(因为它没有自己的this)
它的this是上下文的(执行环境)

onclick: 点击事件

  1. //点击事件
  2. btn.onclick = function(){
  3. console.log(this)
  4. }
  5. //删除点击事件
  6. btn.onclick = null

事件侦听器

addEventListener()

  1. //addEventListener('事件名称',方法)
  2. //可以添加多个同名的事件方法,会按照顺序执行多个事件
  3. btn.addEventListener('click',function(){
  4. console.log('第一个事件')
  5. });
  6. btn.addEventListener('click',function(){
  7. console.log('第二个事件')
  8. });
  9. ...

事件添加,删除,派发实战

addEventListener('click',functuion): 事件添加

removeEventListener('click',function): 删除事件的时候,方法要单独写

dispatchEvent(): 事件派发,把事件委托到别处并且自动执行

  1. ...
  2. //添加事件
  3. box.addEventListener('click',function(){
  4. console.log('1')
  5. })
  6. //事件删除,如果有方法的话,把方法封装后再进行添加和删除如下:
  7. const show = function(){
  8. console.log(1)
  9. }
  10. //先添加事件
  11. box.addEventListenner('click',show);
  12. //删除事件
  13. box.removeEventListener('click',show);
  14. //事件派发
  15. //创建事件对象固定语法 new Event('事件')
  16. const res = new Event('click');
  17. box.dispatchEvent(res)//

定时器

setTimeout(function,time): 一次性执行,只执行一次
setInterval(function,time): 间接式执行
clearTimerout(): 删除一次性执行的定时器
clearInterval(): 删除间接式定时器

  1. //一次性执行
  2. let i = 0;
  3. let out = setTimeout(function(){
  4. i++;
  5. console.log(i)//1
  6. },1000);
  7. //删除一次性执行
  8. clearTimerout(out);
  9. //每间隔1s执行一次
  10. let val = setInterval(function(){
  11. i++;
  12. console.log(i) //每隔一秒将会执行一次
  13. //停止间隔执行
  14. //一般会有一个条件判断,执行停止 用在倒计时上面比较多
  15. clearInterval(val);
  16. },1000);

阻止事件继续冒泡到父元素

eve.stopPropagation(): 事件由内向外,逐级向上传递一直到根元素

eve.preventDefault(): 禁止默认行为,点击后没有任何反应

  1. box.addEventListenner('click',function(){
  2. console.log('父元素')
  3. });
  4. item.addEventListenner('click',function(eve){
  5. console.log('子元素');
  6. eve.stopPropagation(); //点击子元素将不会执行
  7. })

事件代理

ev.currentTarg: 绑定主体
ev.target: 事件触发主体

  1. box.addEventListener('click',function(eve){
  2. console.log(eve.currentTarget) //事件绑定的主体
  3. console.log(eve.target.textContent) //事件触发主体
  4. });

常用表单事件

onchange: 当表单的值发生改变时触发
onsubmit: 提交表单时候触发
onfocus: 获取表单元素焦点时候触发
onblur: 表单失去焦点时候触发
onkeydown: 当按下键盘触发
onkeyup: 当键盘弹起时触发
onkeypress: 当按住键盘触发
onclick: 点击表单元素后触发

模块的声明与导入

使当前的script支持模块功能

<script type="module">
….
</script>

export 导出关键字
import moduleName from './module.js': 导入固定语法

普通导入\导出

  1. //模块A导出
  2. export function multiply(a,b){
  3. return a*b
  4. };
  5. export const PI = 3.14159;
  6. //模块B导入
  7. import {multiply,PI} from './moduleA'
  8. console.log(multiply(2,3))
  9. console.log(PI)

批量导入 * as \ 批量导出

  1. //模块A 导出
  2. function square(x){
  3. return x*x
  4. }
  5. function cube(x){
  6. return x*x*x;
  7. }
  8. export {square,cube}
  9. //模块B 导入 * as
  10. import * as math from './moduleA';
  11. console.log(math.square(3)) //输出 9
  12. console.log(math.cube(3)) //输出 27

别名导入 防止命名冲突 {旧 as 新} \别名导出

  1. //模块A 导出
  2. function square(x){
  3. return x*x
  4. }
  5. function cube(x){
  6. return x*x*x;
  7. }
  8. //别名导出
  9. export {square, cube as cubes}
  10. //模块B 别名导入
  11. import {square as squarer, cubes} from './moduleA'
  12. console.log(squarer(3)) //输出 9

打包导出

比较常用使用类来打包

  1. //模块A
  2. export class User{
  3. constructor(uname){
  4. this.uname = uname
  5. }
  6. greet(){
  7. return `欢迎您${this.uname}`
  8. }
  9. }
  10. //模块B
  11. import {User} from './moduleA';
  12. const user = new User('小刘');
  13. console.log(user.greet())

默认导出(匿名导出)

default 默认导出 关键字

一个模块中只有一个默认导出
``javascript //模块A export default class{ constructor(uname){ this.uname = uname } greet(){ return你好${this.uname}`
}
}

//模块B
//默认导入就不需要使用{} user1 任意命名
import user1 from ‘./moduleA’;
const user = new user1(‘小刘’);
console.log(user.uname) //你好小刘

  1. #### 混合导出
  2. > 默认的不要加{}, add, {a,b}
  3. ```javascript
  4. // 模块A
  5. //默认导出
  6. export default function add(a, b) {
  7. return a + b;
  8. }
  9. export function subtract(a, b) {
  10. return a - b;
  11. }
  12. export function multiply(a, b) {
  13. return a * b;
  14. }
  15. //模块B
  16. import add,{ subtract, multiply } from './moduleA';
  17. console.log(add(2, 3)); // 输出:5
  18. console.log(subtract(5, 2)); // 输出:3
  19. console.log(multiply(2, 3)); // 输出:6

JSON

类型

number ,string ,boolean ,null ,array ,object

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post