eventTarget.onclick = function (event) {}
eventTarget.addEventListener('click',function (event) {})
1.event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态,大概就是事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法
2.事件对象只有有了事件才会存在,它是系统自动创建的,不需要我们传递参数,比如鼠标点击,里面就包含了鼠标的相关信息,像鼠标坐标,如果是键盘事件,里面就包含了键盘事件的信息,像判断用户按下了哪个键
3.这个事件对象我们可以自己命名,比如event,eve,e
4.这个也有兼容性问题 ie678通过window.event,兼容性写法 e= e||window.event
事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象 标准 |
e.srcElemnet | 返回触发事件的对象 非标准 ie6-8使用 |
e.type | 返回事件的类型 比如click mouseover 不带on |
e.cancleBubble | 该属性阻止冒泡 非标准 ie6-8使用 |
e.returnValue | 该属性阻止默认事件(默认行为)非标准 ie6-8使用 比如不让链接跳转 |
e.preventDefault() | 该属性阻止默认事件(默认行为)标准 比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡 标准 |
e.target返回的是触发事件的对象(元素),this返回的是绑定事件的对象(元素)
var ul = document.querySelector('ul');
var li = document.querySelector('li');
ul.addEventListener('click', function (e) {
console.log(e.target);;
console.log(this);
})
此时e.targe返回li,this返回ul
e.type返回事件类型
var div = document.querySelector('div');
div.addEventListener('click', fun)
function fun(e) {
console.log(e.type);
}
返回事件类型click,也可以加别的时间类型,像mouseover
var a = document.querySelector('a');
a.addEventListener('click', function (e) {
e.preventDefault();//dom标准写法
})
//传统的注册方式
a.onclick = function (e) {
//普通浏览器 e.preventDefault(); 方法
e.preventDefault();
//传统浏览器 e.returnValue; 属性
e.returnValue;
//没有兼容性问题 return false 特点就是return后面的代码不执行
return false;
}
可以阻止事件对象默认行为,例如点击链接不跳转
e.preventDefault()-->方法,适用于普通浏览器
e.returnValue-->属性,适用于ie678
return false-->没有兼容性问题,特点:return后面的代码不执行,而且只限于传统的注册方式
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
阻止事件冒泡:
标准写法:
var son = document.querySelector('.son');
son.addEventListener('click', function (e) {
alert('son');
e.stopPropagation();
}, false);
非标准写法:
var son = document.querySelector('.son');
son.addEventListener('click', function (e) {
alert('son');
e.cancelBubble = true;
}, false);
这些可以阻止冒泡,不去执行上一级绑定的事件
事件委托也称为事件代理,在jQuery里面称为事件委派
原理:给事件父节点设置事件监听器,利用冒泡原理影响设置每个子节点
案例:点击元素调出对应的对话框,尽可能少设置事件
var ul = document.querySelector('ul');
ul.addEventListener('click', function (e) {
e.target.style.backgroundColor = 'pink';
}, false)
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
再扩充两个鼠标事件:
主要控制该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单
document.addEventListener('contextmenu',function(e)
{
e.preventDefault();
})
document.addEventListener('selectstart',function(e)
{
e.preventDefault();
})
event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要用鼠标事件对象MouseEvent和键盘事件KeyboardEvent
鼠标事件对象 | 说明 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区的x坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区的y坐标 |
e.pageX | 返回鼠标相对于文档页面的X坐标 IE9+支持 |
e.pageY | 返回鼠标相对于文档页面的Y坐标 IE9+支持 |
e.screenX | 返回鼠标相对于电脑屏幕的X坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
(1)client,以可视区为准,移动页面后,再点击此处坐标不变
(2)page,以页面文档为准,移动页面后,再点击此处纵坐标变
(3)screen,以电脑屏幕为准
案例:跟随鼠标的天使
css:
img {
position: absolute;
top: 25px;
left: 25px;
width: 50px;
}
HTML:

JavaScript:
var img = document.querySelector('img');
document.addEventListener('mousemove', function (e) {
var x = e.pageX;
var y = e.pageY;
img.style.left = x + 'px';
img.style.top = y + 'px';
})
键盘事件 | 触发条件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按键被按下时触发 但是不识别功能键,如Ctrl shift键 |
注意:如果使用addEventListener不用加on
//弹起时
document.addEventListener('keyup', function (e) {
console.log(111);
})
//按下时
document.addEventListener('keydown', function (e) {
console.log(222);
})
//弹起时
document.addEventListener('keypress', function (e) {
console.log(333);
})
三个事件的执行顺序:keydown->keypress->keyup
键盘事件对象属性 | 说明 |
---|---|
keyCode | 返回该键的ASCLL值 |
注意:
1.我们的onkeyup和onkeydown不区分大小写,a和A得到的都是65,onkeypress区分大小写
2.实际开发中,更多使用keydown和keyup,能是捏所有键(包括功能键)
3.ketpress不识别功能键,但是keyCode区分大小写,返回不同的ASCLL值
案例:模拟京东按键输入内容
对于一个输入框:
var input = document.querySelector('input');
document.addEventListener('keyup', function (e) {
if (e.keyCode == 83) {
input.focus();
}
})
案例:模拟京东快递单号查询
css:
.search {
position: relative;
width: 178px;
margin: 100px;
}
.con {
display: none;
position: absolute;
top: -40px;
width: 171px;
border: 1px solid rgba(0, 0, 0, .2);
box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
padding: 5px 0;
font-size: 18px;
line-height: 20px;
color: #333;
}
.con::before {
content: '';
width: 0;
height: 0;
position: absolute;
top: 100%;
left: 18px;
border: 8px solid transparent;
border-top-color: rgba(0, 0, 0, .2);
}
HTML:
123
JavaScript:
var con = document.querySelector('.con');
var jd_input = document.querySelector('.jd');
jd_input.addEventListener('keyup', function () {
if (this.value == '') {
con.style.display = 'none';
}
else {
con.style.display = 'block';
con.innerHTML = this.value;
}
jd_input.addEventListener('blur', function () {
con.style.display = 'none';
})
jd_input.addEventListener('focus', function () {
if (this.value == '') {
con.style.display = 'none';
}
else {
con.style.display = 'block';
}
})
注意:keydown和keypress在文本框里面的特点:他们两个事件触发的时候,文字还没有落入文本框中