JavaScript学习笔记
JavaScript学习笔记
操作属性
|
|
获取标签 |
querySelector(‘CSS选择器’)返回一个元素对象,可以直接操作;找不到返回null; querySelectorAll(‘CSS选择器’)返回一个伪数组,需要遍历得到对象再操作; 注意:参数必须加引号(字符串),参数必须是CSS选择器; 伪数组:没有pop、push等方法,但是可以遍历; |
inner |
元素.innerText属性,元素.innerHTML属性; innerText只识别文本,不解析标签; innerHTML能识别文本,也能解析标签;(推荐) |
style |
对象.style.样式属性=值 const box=document.querySelector(‘.box’) box.style.width=’200px’ box.style.marginTop=’15px’ box.style.backgroundColr=’pink’ 修改样式属性,通过style属性引出;样式属性都放在style属性中; 如果属性名有-连接符,需要转换为小驼峰命名法; 赋值时,需要带单位px; |
className |
className配合样式进行使用,通过修改className,就匹配到对应的样式; className只适用于单类名,而不适用于多类名;多类名用classList进行操作; .c1 {color: red;} .c2 {color: blue;} <h1 class="c1">这里是标题</h1> const h1 = document.querySelector('h1')//查询获取元素对象 h1.innerHTML = '新设置的标题'//修改元素属性,从而修改文本内容 h1.className='c2'//修改类名,从而修改样式 |
classList |
为了解决className容易覆盖原值的情况,可以通过classList追加和删除类名; 元素.classList.add(‘类名’)//追加一个类; 元素.classList.remove(‘类名’)//删除一个类; 元素.classList.toggle(‘类名’)//添加或删除一个类; 如果classList中没有这个类名,就是添加,并返回true; 如果classList中有这个类名,就是删除,并返回false; classList toggle() 方法说明 该classList.toggle()方法允许您根据当前class属性值添加或删除类名。 如果要切换的类名已经存在于元素中,则该toggle()方法将删除该类名,反之亦然。 您可以通过它返回的值知道该toggle()方法是否添加或删除了一个类。如果类名被删除,toggle()将返回false. 添加类名后,将返回true. |
自定义属性
|
html5中推出的自定义属性data-自定义属性名; DOM对象上以dataset对象方式获取自定义属性; 例如,定义用data-id获取用dataset.id <div class=”box” data-id=”10”>盒子</div> <script> const box=document.querySelector(‘.box’) console.log(box.dataset.id) </script> |
window.定时器
延时函数 |
一定时间后,执行某个操作,只执行一次;
let timer=setTimeout(回调函数,等待毫秒数) clearTimeout(timer)清除 |
间歇函数 |
每间隔一定时间,执行一次回调函数; let timer=setInterval(回调函数,间隔毫秒数) clearInterval(timer)清除 函数名字不需要加括号,定时器返回的是一个id数字; function(){console.log(‘每秒执行一次’)} setInterval(fn,1000)//fn不需要小括号,时间单位是毫秒; |
元素位置尺寸
获取宽高 |
offsetWidth,offsetHeight; 获取元素自身的宽度和高度,包含padding,border; 得到的是数值方便计算; 获取的是可视宽高,如果盒子隐藏,结果为0; |
获取位置 |
offsetLeft,offsetTop是只读属性; 元素距离父元素的左侧和上侧的距离; |
获取宽高 |
clientWidth,clientHeight; 获取可见部分宽高,不包含边框、margin、滚动条; |
获取位置 |
scrollLeft,scrollTop;可读可写; 获取被卷去的大小; 获取元素滚出去(看不到)的距离; |
事件分类
事件总结
resize |
window.addEventListener(‘resize’,funciton(){//要执行的操作 let w=document.documentElement.clientWidth}) |
scroll |
window.addEventListener(‘scroll’,function(){//要执行的操作}) |
load |
监听整个页面资源加载情况;也可以监听某个元素的加载情况; window.addEventListener(‘load’,function(){//要执行的操作}) img.addEventListener(‘load’,function(){//要执行的操作}) |
DOMContentLoaded |
只是加载DOM元素,而不包含样式表、图片等; |
事件委托 |
事件委托:利用事件流特征,解决一些开发需求的技巧; 优点:减少注册次数,提高程序性能; 原理:利用事件冒泡特点; 给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件; ul.addEventListener(‘click’,function(){}) |
鼠标经过事件 |
mouseover,mouseout会有冒泡效果; mouseenter,mouseleave没有冒泡效果;(推荐) |
解绑事件 |
function fn(){} btn.addEventListener(‘click’,fn) btn.removeEventListener(‘click’,fn) 匿名函数无法解绑; |
阻止冒泡 |
默认冒泡,容易导致事件影响到父级元素; 把事件限制在当前元素内,需要阻止事件冒泡; 前提:需要拿到当前事件对象; 事件对象.stopPropagation() |
键盘事件 |
keyup,keydown; tx.addEventListener(‘keyup’,function(e){ if(e.key===’Enter’){item.style.display=’block’ }}) |
事件捕获(父→子)和事件冒泡(子→父)
阻止
阻止冒泡 |
事件对象.stopPropagation(); 将事件局限在本对象范围内,而不会传递到父对象; |
阻止默认行为 |
e.preventDefault(); 阻止元素的默认行为,例如链接的跳转,表单的submit等; |
日期时间
时间戳 |
时间戳:1970年1月1日0时0分0秒起至今的毫秒数; const last=new Date(‘2022-5-1 18:30:00’);返回字符串形式的时间戳;毫秒数 const now=new Date()返回字符串形式的当前时间戳; +new Date()将字符串转换为数字形式; const date=new Date() ;//实例化日期对象 date对象:月份0-11星期0-6; date.getTime();获取当前时间戳; Date.now()当前时间戳,无需实例化;
|
日期对象 |
const date=new Date() ;//实例化日期对象 getFullYear,getMonth获取月份:0-11,getDate,getDay获取星期:0-6; getHours:0-23,getMinutes:0-59,getSeconds:0-59; |
|
|
节点操作
查找节点 |
节点关系:父子关系、兄弟关系; 父元素.children()获取所有元素节点,返回一个伪数组; 伪数组:没有普通数组的一些方法pop等; childNodes获得所有子节点,包括文本节点(空格、换行),注释节点等; 兄弟节点: nextElementSibling上一个兄弟,previousElementSibling下一个兄弟 子元素.parentNode,查找父元素节点; |
创建节点 |
document.createElement(‘标签名’) document.createElement(‘div’) const ul=document.querySelector(‘ul’) const li=document.createElement(‘li’) li.innerHTML=’我是li’
|
添加节点 |
//父元素.appendChild(要插入的元素),插入到所有子元素尾部 ul.appendChild(li) //父元素.insertBefore(要插入的元素,放在哪个子元素前面) ul.insertBefore(li,ul.children[0]) ul.appendChild(li) |
克隆节点 |
复制一个节点,将节点放到指定元素内部; 元素.cloneNode(Boolean); true表示克隆所有后代节点,false表示不克隆后代节点;默认false; |
删除节点 |
删除元素必须通过其父元素;没有父子关系的无法删除; 父元素.removeChild(要删除的节点元素) ul.removeChile(ul.children[0]) |
手机端事件
touchstart手指触摸一个DOM元素时触发;
touchend,手指从一个DOM元素离开时触发;
touchmove手指在一个DOM元素上滑动时触发;
window下面的对象
history对象 |
管理浏览器的历史记录; back后退;forward前进;go(参数)参数1前进,-1后退; |
navigator |
记录浏览器相关信息; 可以根据不同的浏览器执行区别化的操作,使得适应性更强; navigator.userAgent : 浏览器用于 HTTP 请求的用户代理头的值,通过UserAgent可以取得浏览器类别、版本,客户端操作系统等信息。 在PC端打开 ,navigator.userAgent 显示如下 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36 在手机web端打开 ,navigator.userAgent 显示如下 Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
|
location |
存储当前页面的url,可以通过修改href,让当前页面进行跳转; location.href=’http://www.baidu.com’ |
|
|
持久化存储:localStorage
永久存储键值对,除非手动删除;多个窗口/页面可以共享,同一浏览器可以共享;页面刷新不丢失;
简单类型 |
localStorage.setItem(‘uname’,’齐天大圣’) localStorage.getItem(‘uname’)
|
复杂类型 |
obj={name:’李四’,age:18,gender:’男’} localStorage.setItem(‘obj’,JSON.stringify(obj))//先转化为json字符串,然后存储到localStorage const newObj=JSON.parse(localStorage.getItem(‘obj’))//先读取json字符串,然后解析为js对象 |
临时性存储:sessionStorage
声明周期为关闭浏览器窗口;
再同一个窗口(页面)下数据可以共享;
以键值对的形式存储;
使用方法同localStorage;
数组方法总结
map |
数组的map方法:将数组中的元素按照规则映射为一个新数组,并返回; const arr=[‘red’,’blue’,’green’] const newArr=arr.map(function(element,index){return element+’颜色’;})
|
forEach |
数组中的forEach方法,遍历数组元素;
|
join |
数组中的join方法:将数组中的元素连接 成一个字符串; |
|
document.body.style.backgroundImage=`url(./images/desktop_${random}.jpg)`
innerHTML()解析传入字符串中的html标签;
innerText()不解析字符串中的html标签;
document.querySelectorAll(‘.box’);选择所有匹配项;
找到就返回数组(伪数组),有长度length,但是没有pop,push方法;
document.querySelector(‘div’);只选择第一个匹配项;找到就返回一个对象,找不到就返回null;
随机数
一般浮点数 |
Math.random()随机数[0,1)浮点数 Math.random()*11随机数[0,11)浮点数
|
0-end整数 |
Math.floor(Math.random()*(end+1)) |
start-end整数 |
Math.floor(math.random()*(end-start+1)+start) |
对象属性的增删改查:
- 删:delete stu.name;
- 改:已有的属性直接赋值;
- 增:没有的属性直接赋值;
- 查1:用.运算符;
- 查2:用中括号[‘’];
classList、querySelector
const h2 = document.querySelector('h2')
console.log(h2.classList)//DOMTokenList(2) ['b1', 'c1', value: 'b1 c1']
h2.classList.remove('b1')//移除b1类
console.log(h2.classList)//DOMTokenList(1) ['c1', value: 'c1']
h2.classList.add('b2')//添加b2类
console.log(h2.classList)//DOMTokenList(2) ['c1', 'b2', value: 'c1 b2']
h2.classList.toggle('c2')//添加或删除
console.log(h2.classList)//DOMTokenList(3) ['c1', 'b2', 'c2', value: 'c1 b2 c2']
// 如果classList中没有这个类名,就是添加,并返回true;
// 如果classList中有这个类名,就是删除,并返回false;
const h1 = document.querySelector('h1')
h1.innerHTML = '新设置的标题'
h1.className = 'c2'
// const h1 = document.querySelector('h1')
// console.log(h1)//h1对象
// const h2 = document.querySelector('h2')
// console.log(h2)//null 找不到对象,就返回null
// const lis1 = document.querySelectorAll('.list1 li')
// console.log(lis1)//NodeList(4) [li, li, li, li]
// const lis2 = document.querySelectorAll('list2 li')
// console.log(lis2)//NodeList(0) [], 找不到,就返回空数组(伪数组)
// const lis3 = document.querySelectorAll('list3 li')
// console.log(lis3)//NodeList(0) [], 找不到,就返回空数组(伪数组)
|
数据类型、布尔值、逻辑中断
//■数据类型
// let num = 10
// console.log(typeof num)//number
// console.log(typeof (num))//number
// let str = 'hello'
// console.log(typeof str)//string
// console.log(typeof (str))//string
// let flag = true
// console.log(typeof flag)//boolean
// console.log(typeof (flag))//boolean
// let un
// console.log(typeof un)//undefined
// console.log(typeof (un))//undefined
// let obj = null
// console.log(typeof obj)//object
// console.log(typeof (ojb))//undefined
// let nan = NaN
// console.log(typeof nan)//number
// console.log(typeof (nan))//number
//■布尔值
// console.log('-----builtin-----')
// console.log(Boolean(true))//true
// console.log(Boolean(false))//false
// console.log(Boolean(undefined))//false
// console.log(Boolean(null))//false
// console.log(Boolean(NaN))//false
// console.log('-----number-----')
// console.log(Boolean(100))//true
// console.log(Boolean(3.14))//true
// console.log(Boolean(0.00))//false
// console.log(Boolean(0))//false
// console.log(Boolean(-0.00))//false
// console.log('-----string-----')
// console.log(Boolean('hello'))//true
// console.log(Boolean('true'))//true
// console.log(Boolean('false'))//true
// console.log(Boolean('null'))//true
// console.log(Boolean('undefined'))//true
// console.log(Boolean('0'))//true
// console.log(Boolean(''))//false
// console.log('-----array-----')
// console.log(Boolean([1, 2, 3]))//true
// console.log(Boolean([0, 0, 0]))//true
// console.log(Boolean([]))//true
// console.log('-----object-----')
// console.log(Boolean({ name: 'tom' }))//true
// console.log(Boolean({}))//true
//■逻辑中断
console.log(22 || 33)//22
console.log(0 || 33)//33
console.log(22 && 33)//33
console.log(0 && 33)//0
console.log('res' || 'default')//res
console.log('' || 'default')//default
//■显式类型转换
console.log('-----Number-----')
console.log(Number('22'))//22 转换成功
console.log(Number('.22'))//.22 转换成功
console.log(Number('22.33'))//22.33 转换成功
console.log(Number('22.33.44'))//22.33 转换成功
console.log(Number('22aa'))//NaN 转换失败 结果肯定不是数字,具体是什么不知道
console.log(Number('22啊啊'))//NaN 转换失败 结果肯定不是数字,具体是什么不知道
console.log(Number('啊啊22'))//NaN 转换失败 结果肯定不是数字,具体是什么不知道
//所有字符只能是数字或者小数点,不能有其他字符,才能转换成功;
console.log('-----parseInt-----')
console.log(parseInt('88'))//88 转换成功 只取前面的数字部分
console.log(parseInt('88.44'))//88 转换成功 只取前面的数字部分
console.log(parseInt('88哈哈'))//88 转换成功 只取前面的数字部分
console.log(parseInt('88.56px'))//88 转换成功 只取前面的数字部分
console.log(parseInt('.88'))//NaN 转换失败 结果肯定不是数字,具体是什么不知道
console.log(parseInt('px88.56')) //NaN 转换失败 结果肯定不是数字,具体是什么不知道
//必须数字开头,才能转换成功,否则失败
console.log('----------')
console.log(parseFloat('88'))//88
console.log(parseFloat('88.44'))//88.44 从前面开始,数字和小数点
console.log(parseFloat('88哈哈')) // 88
console.log(parseFloat('88.56px'))//88.56 从前面开始,数字和小数点
console.log(parseFloat('px88.56'))//NaN 转换失败 结果肯定不是数字,具体是什么不知道
console.log(parseFloat('88.44.55.66'))//88.44
console.log(parseFloat('.44.55.66'))//0.44
//以数字或小数点开头,就能转换成功,否则失败;
console.log('-----+-----')
console.log(+'88')//88
console.log(+'88.44')//88.44
console.log(+'88哈哈')//NaN
console.log(+'88.56')//88.56
console.log(+'88.56px')//NaN
console.log(+'px88.56px')//NaN
console.log(+'.88')//0.88
console.log(+'.88.56')//NaN
console.log(+'.88px')//NaN
console.log(+'3.1.4')//NaN
//必须全部是数字或小数点,并且小数点个数不能超过1个,才能转换成功;
|
|
数据类型转换
数据类型转换
隐式转换 |
+两边只要有一个字符串,会把另个一转换为字符串;‘1’+1=‘11’; +以外的算术运算符,会把数据转换成数字;‘22’/2=11; 任何数字和字符串相加,结果都是字符串; +作为正号可以将字符串转换为数字;(有用) |
显式转换 |
+,Number(),parseInt(),parseFloat() var a1 = parseFloat("100.456啊啊啊");//a的结果为100 var b1 = parseFloat("1.2xxx")//b的结果为1.2 l + //必须全部是数字或小数点,并且小数点个数不能超过1个,才能转换成功; l parseFloat //以数字或小数点开头,就能转换成功,否则失败; l parseInt //必须数字开头,才能转换成功,否则失败; l Number //所有字符只能是数字或者小数点,可以有多个小数点,不能有其他字符,才能转换成功; |
NaN不知道结果是什么,但是肯定不是一个数字;
任何对NaN的操作,返回的结果都是NaN;
JavaScript 弱数据类型;
基本数据类型 num,string,boolean,undefined,null,引用类型:对象object;
常量const a=10,声明时必须赋值,声明后不能再次赋值;
var有很多bug,弃用,声明变量统一使用let;
数组 arr.length ,arr[0] arr[3];
变量声明let age let name
声明多个变量let age=19,name=’tom’
字面量{}对象,[]数组,’’字符串
内部、外部、行内
- write(‘’)里面可以写html标签;
- alert(‘’)会优先执行
- log(‘’)
- prompt(‘’)会优先执行
内部和外部JS
<!-- 内部js --> <script> // alert('hello 内部js') </script> |
<!-- 外部js --> <script src="hello.js"></script> hello.js alert(‘hello 外部js’) |
JS位置、CSS位置
行内JS |
<input type="button" value="点击有惊喜" οnclick="javascript:alert('哈哈哈哈')"> |
内部JS |
<script ></script>标签内 |
外部JS |
<script src="hello.js"></script> <script src="../../js/js4.js" type="text/javascript" charset="utf-8"> |
行内CSS |
<p style="font-size: 18px;">行内样式</p> |
内部CSS |
将样式编写到head中的style标签里 <head> <style type = "text/css"> p{color: aqua;} </style></head> |
外部CSS |
<link rel="stylesheet" type="text/css" href="min.css"> |
学习网址:
https://developer.mozilla.org/zh-cn/docs/web/javascript
https://www.swiper.com.cn/
#end