获取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.236
Math.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