原生JS的常用API
Dom相关:
选中dom元素:
给dom元素增添id,则该id就是JS的全局变量(企业开发不适合):
portfolio.onclick = function () {
portfolioBar.className = 'bar state-1'
}
ES5以后新增的选择器选中(和CSS选择器规则一致):
返回单个对象
var topNavBar = document.querySelector('#topNavBar')
返回所有数组
var elementList = document.querySelectorAll(selectors)
ES3时使用的选中方式:
选中id(返回单个对象):
var element = document.getElementById(id);
选中类名(返回数组):
var elements = document.getElementsByClassName(names);
选中标签名(返回数组):
var elements = element.getElementsByTagName(tagName)
选中name属性(返回数组):
varelements= document.getElementsByName(name)
监听dom元素的事件:
dom标准0的写法:xxx.onclick =()=>{}
dom标准2的写法:document.addEventListener('onclick ', ()=>{} })
区别:标准0的只能监听1个事件,因为他维护的是一个属性。 标准2的可以维护一个事件队列,所以可以监听多个事件。
监听点击事件:
portfolio1.onclick = function (ev) {
console.log(ev)
}
监听鼠标移入事件:
liTags[i].onmouseenter = function (ev) {
console.log(ev)
}
监听鼠标移出事件:
liTags[i].onmouseleave = function (ev) {
console.log(ev)
}
监听窗口滑动事件:
window.onscroll = function (ev) {
console.log(ev)
}
监听移动端手指触摸事件
监听移动端手指滑动事件
监听动画完成事件
div.addEventListener('transitionend', ()=>{} )
监听页面被切换事件
document.addEventListener('visibilitychange',function(){
console.log(document.hidden) //true false
})
浏览器事件触发后,回调函数时传入的ev参数:
ev.target 表示事件触发的dom元素(如果监听a标签,而点击了a里面的span,则此时返回的是span)
ev.currentTarget 表示监听时的dom元素(监听什么,拿到什么)
ev.preventDefault() 表示吞掉默认行为(比如监听a标签,使用该方法后,点击a标签不会自动跳转)
创建dom元素:
var a = document.createElement('a')
给a标签中间,增加文本内容
a.textContent = '你好'
给a增加id的属性:
a.id = 'a-id'
给a标签赋值href属性:
a.href = 'https://www.baidu.com'
把a标签插入到main标签的后面:
document.querySelector('main').appendChild(a)
获取span标签的属性节点name的值:
span.getAttribute("name")
修改span标签的属性节点name的值为123:
span.setAttribute("name","123")
改变dom元素的css样式:
elt.setAttribute("style", "color:red; border: 1px solid blue;");
(下面的方式,谷歌浏览器使用无效)
elt.style.cssText = "color: blue; border: 1px solid black";
dom时钟类api:
创建一个一次性时钟t,3000毫秒(3秒)后,执行函数fn;
function fn(){ alert("Hello") }
var t = setTimeout(fn, 3000);
创建一个重复执行闹钟,每3000毫秒后,执行fn函数
function fn(){ alert("Hello") }
var t =setInterval(fn, 3000);
配置一个一次性执行闹钟t,然后清除一个一次性执行闹钟t
var t = setTimeout(()=>{ console.log('hello') },3000);
clearTimeout(t);
配置一个重复执行闹钟t,然后清除一个重复执行闹钟t
var t =setInterval(()=>{ console.log('hello') }, 3000);
clearInterval(t);
dom元素的类相关api:
给元素a新增类:
a.classList.add(class)
给元素a删除类:
a.classList.remove(class)
给元素a重写所有类(bar和asd):
a.className = 'bar asd '
dom元素寻找亲戚的api:
找到div标签的父亲
div.parentNode
dom元素其他api:
元素距离页面最顶部的距离
element.offsetTop
寻找dom元素a后面的兄弟标签,(注意该方法会连文本也算在兄弟标签内,所以如果要用需要使用套路遍历寻找到下个非文本标签):
var brother = a.nextSibling
while(brother.nodeType === 3 ||brother === null){
brother = brother.nextSibling
}
“brother.nodeType === 3 || brother.nodeType!== null”的意思是,如果下一个兄弟是文本或者下个兄弟不是null,那么我继续遍历寻找下一个dom元素
寻找dom元素a前面的兄弟标签(注意点和上面一样):
var brother = a.previousSibling
while(brother.nodeType === 3 || brother === null){
brother = brother.previousSibling
}
取出dom元素中的属性,使用该方法取属性,取的就是浏览器解析之前dom元素所赋值的属性:
let href = aTag.getAttribute('href')
将div2追加到div1的子元素中
div1.appendChild(div2)
深拷贝一个div1元素
var div_clone = div1.cloneNode(true)
div1是否包含div2,判断是否为后代的元素
div1.contains(div2) // true false
判断div1是否有儿子
div1.hasChildNodes() // true false
将div2插到div1子元素的最前面
div1.insertBefore(div2)
判断div1与div2 是否内容和属性完全一样(两者在堆区存储的内存地址不同)
div1.isEqualNode(div2)
判断div1与div2 是否为同一个div(两者在堆区存储的内存地址完全相同)
div1.isSameNode(div2)
删除div1的子元素div2(此时删除的div2,并没有从内存中释放,还是会存在内存里的,只是不存在于页面中)
div.removeChild(div2)
替换div1的子元素div2,替换成div3(此时的div2和上面一样,没有从内存中移除)
div1.replaceChild(div3,div2)
将div1里面的所有相领文本节点合并(历史原因出现的API,以前程序员写代码会出现多个相邻文本节点的情况)
div1.normalize()
Bom相关:
打开新的页面,并跳转到指定url:
window.open('http://www.baidu.com')
让用户输入文本,并获取该文本
var text = prompt('请输入一段文本:')
往LocalStorage存东西(只能存储字符串):
localStorage.setItem('容器1', JSON.stringify({name:'linshiqi'}))
从LocalStorage取东西,取不到就返回字符串的null (只能存储字符串):
JSON.parse(localStorage.getItem('容器1') || 'null')
字符串(对象)相关:
获取字符串h的unicode编码(十进制)
'nihao'.charCodeAt(2)
获取字符串h的unicode编码(十六进制)
'nihao'.charCodeAt(2).toString(16)
获取字符串左右两边去除空格和换行符的结果
' 你好 '.trim()// '你好'
连接两个字符串,获取结果
'你'.concat('好')// '你好'
获取字符串的切片结果(第一个参数是开始并包含,最后一个参数是最后的前一个,不包含第二个参数)
'你好呀,我是xxx'.slice(0,2) // '你好'
替换字符串中的字符(其中第一个参数可以代入正则表达式,符合规则的都会被替换)
'你好呀,我是xxx'.replace('好','不好') //"你不好呀,我是xxx"
indexOf作用:
可以查找该字符串中是否包含某字符串,如果不包含返回-1,包含返回某字符串在该字符串中的起始位置
parseInt() 可以把一个字符串转换成整数。
parseFloat() 可以把一个字符串转换成小数。
typeof() 查看数据类型
数组相关:
向数组a的开头添加一个或更多元素,并返回新的长度。
a.unshift()
删除并返回数组a的第一个元素
a.shift()
向数组a的末尾添加一个或更多元素,并返回新的长度。
a.push()
删除并返回数组a的最后一个元素
a.pop()
颠倒数组a中元素的顺序。
a.reverse()
从数组a中添加/删除项目,然后返回被删除的项目(会改变原数组)。
a.splice( 规定添加/删除项目的位置, 要删除的项目数量, item1,.....,itemX:向数组添加的新项目)
可从已有的数组中返回选定的元素。
slice( 何处开始选取, 规定从何处结束选取)
遍历数组的所有元素
var a = [1,2,3,4,5]
a.forEach(function(value,key){
console.log('key:',key)
console.log('value:',value)
})
遍历数组后,返回每一项都经过函数处理并返回的数组
var a = [1,2,3,4,5]
var b = a.map(function(value,key){
return value * 2
})
遍历数组后,返回每一项都经过函数处理后过滤不需要项的数组
var a = [1,2,3,4,5]
var b = a.filter(function(value,key){
if (value > 2) return value
})
遍历数组后,每一项的返回结果都依次传递出来(可以模仿前面几种遍历,最灵活)
模仿filter:
var a = [1,2,3,4,5]
var b = a.reduce(function(arr,value){
if(value>2){arr.push(value)}
return arr
},[])
数组与字符串拼接,返回一个字符串,代入一个值后拼接数组中的每一项的值
var a = [1,2,3,4,5]
var b = a.join('+')
数组与数组拼接,返回一个数组(新的数组),代入一个数组后追加到原数组拷贝的数组后面
var a = [1,2,3,4,5]
var b = a.concat([3,2,1])
数组排序
升序:
var arr = [4,3,6,5,7,2,1];
arr.sort();
console.log(arr);
降序:
var arr = [4,3,6,5,7,2,1];
arr.sort();
arr.sort(function(a,b){
return b-a;
});
console.log(arr);
数字、布尔、symbol(对象)相关:
函数相关:
对象、原型相关:
删除对象中的key和value:
var obj = {name:'linsq',age:20}
delete obj['age']
查找对象中是否拥有该key:
'name' in obj // true
'age' in obj // false
遍历对象中的所有key和value,顺序是随机的:
for(let key in obj){
console.log(key,obj[key])
}
//name linsq
获取对象的类型(注意:null显示的是object,函数包括所有构造函数显示的是function):
typeof obj //"object"
typeof Array //"function"
typeof Object //"function"
JSON相关:
用于将 JavaScript 值转换为 JSON 字符串。
JSON.stringify()
用于将一个 JSON 字符串转换为 JavaScript 对象。
JSON.parse()
布尔值其他五种类型中的false情况(如果不是下面五种,则代表是true):
number:0、NaN
Sting: ''(空字符串)
null:null (该类型里没有true的值)
undefined:undefined(该类型里没有true的值)