获取dom节点尺寸
var omw=document.querySelector('#box')
// 获取宽高
console.log(omw.offsetWidth,omw.offsetHeight)
// 获取宽高(不计算边框)
console.log(omw.clientWidth,omw.clientHeight)
获取dom节点偏移量
var a=document.querySelector('.box')
// 获取节点相对于父节点的偏移量(要求父节点要设置position),否则根据整个页面进行计算
console.log(a.offsetLeft,a.offsetTop)
获取可视窗口尺寸
// 包括滚动条
console.log(innerWidth,innerHeight)
// 不包括滚动条
console.log(window.document.documentElement.clientWidth,document.documentElement.clientHeight)
基本事件类型
- 单击:click
 - 双击:dblclick
 - 右键:contextmenu
 - 鼠标按下:mousedown
 - 鼠标抬起:mouseup
 - 鼠标移动:mousemove
 - 移入(包括子节点):mouseover
 - 移入(不包括子节点):mouseenter
 - 移出(包括子节点):mouseout
 - 移出(不包括子节点):mouseleave
 - 键盘按下:keydown
 - 键盘抬起:keyup
 - 得到焦点:focus
 - 失去焦点:blur
 - 内容改变:input
 - 前后内容不一致:change
 - 重置:reset
 - 提交:submit
 - 触摸开始:touchstart
 - 触摸结束:touchend
 - 触摸移动:touchmove
 
常用鼠标事件对象(event)
box.onclick = function (evt) {
    //距离可视窗口的位置
    console.log(evt.clientX, evt.clientY) 
    //距离整个页面的位置,不受滚动条影响
    console.log(evt.pageX, evt.pageY) 
    //距离自己左上角的位置
    console.log(evt.offsetX, evt.offsetY)  
}
阻止事件传播
ob.onclick=function(evt){
    evt.stopPropagation()  //阻止这个按钮事件往下传播
}
阻止默认行为
// dom0的方式
// document.oncontextmenu=function(){
//     console.log("自定义右键菜单")
//     return false
// }
//dom2的方式
document.addEventListener('contextmenu',function(evt){
    console.log("自定义右键菜单")
    evt.preventDefault()
})
正则表达式
基本元字符
- \d 数字
 - \D 非数字
 - \s 空白(空格、缩进、换行)
 - \S 非空白
 - \w 字母、数字或下划线
 - \W 非字母、数字或下划线
 - . 任意内容
 - \ 转义字符
 
边界符
- ^ 开头
 - $ 结尾
 
限定符
- * 0~多次
 - + 1~多次
 - ? 0~1
 - {n} 限定n次,必须连续
 - {n,} >=n
 - {n,m} n~m
 
特殊符号
- ( ) 作为整体
 - | 或(两边默认为整体)
 - [] 表示里面只要有一个就行 [^abc]表示取反,不是abc其中一个
 
正则两大特新
懒惰性,解决:使用全局标识符g
贪婪 可以加个?,变成非贪婪
var reg1=/\d{1,4}/ //贪婪 var reg2=/\d{1,4}?/ //非贪婪 console.log(reg1.exec('ab1234d')[0]) // 1234 console.log(reg2.exec('ab1234d')[0]) // 1
this指向问题
call
apply
bind
call 与 apply都会自动执行函数,区别:传入参数的形式不同
bind不会自动执行函数
obj1={ name:'obj1', getName:function(a,b,c){ console.log('getName1',this.name) console.log('参数',a,b,c) } } obj2={ name:'obj2', getName:function(){ console.log('getName2',this.name) } } obj1.getName.call(obj2,1,2,3) // getName1 obj2 // 参数 1 2 3 obj1.getName.apply(obj2,[1,2,3]) // getName1 obj2 // 参数 1 2 3 var fun= obj1.getName.bind(obj2,1,2,3) fun() // getName1 obj2 // 参数 1 2 3
继承
1
function Person(name,age){
    this.myname=name
    this.myage=age
}
Person.prototype.mysay=function(){
    console.log('hello',this.myname)
}
function Student(name,age,grade){
        // 继承
    Person.apply(this,[name,age])
    this.grade=grade
}
// 原型的继承
Student.prototype=new Person()
let stu=new Student('pig',14,100)
console.log(stu)
// {myname: 'pig', myage: 14, grade: 100}
stu.mysay()
// hello pig
2
class Person{
    constructor(name, age){
        this.myname = name
        this.age = age
    }
    mysay(){
        console.log('hello',this.myname)
    }
}
class Student extends Person{
    constructor(name, age, grade){
        super(name, age)
        this.grade = grade
    }
}
let stu = new Student('xz',18,99)
console.log(stu)
// {myname: 'xz', age: 18, grade: 99}
stu.mysay()
// hello xz
数学方法
var num=124.2361234 // 指定保留几位小数,能够四舍五入 console.log(num.toFixed(3)) // 124.236Math.random() 随机数
Math.round() 四舍五入
Math.ceil() 向上取整
Math.floor() 向下取整
Math.abs() 绝对值
Math.sqrt() 平方根
Math.pow(2,4) 2的4次方 = 16
Math.max(10,11,20,1,2,4) 取最大
Math.min(10,11,20,1,2,4) 取最小
Math.PI