事件对象
介绍
事件对象
:当事件发生的时候,浏览器会创建一个事件对象,这个对象包含了当前事件发生时的所有信息
- 事件对象是一个全局对象,在事件发生时,浏览器会创建一个事件对象,并把它作为实参传递给事件处理函数,事件处理函数通过事件对象, 可以获取到事件发生时的相关信息,如鼠标位置,键盘码,鼠标按键状态等
- 鼠标事件
event.clientX
鼠标在可视区X轴坐标event.clientY
鼠标在可视区Y轴坐标event.pageX
鼠标在页面的X轴坐标,IE8不支持event.pageY
鼠标在页面的Y轴坐标,IE8不支持event.screenX
鼠标在屏幕的X轴坐标event.screenY
鼠标在屏幕的Y轴坐标
```js
areaDiv.onmousemove = function(event){
//在IE8中,响应函数被触发是,浏览器不会传递事件对象,而是作为window对象的属性保存的
if(!event){
event = window.event;
}
// event = event || window.event;
let x = event.clientX;
let y = event.clientY;
showMsg.innerHTML = "x:" + x + " y:" + y;
## 事件的冒泡
- 概念: `事件冒泡(Event Bubbling)`是一种事件传播机制,当一个元素上的事件被触发后,该事件会向父元素传播,然后继续向祖先元素传播,直到到达根元素(即文档的根节点)。
- 在大多数情况下,事件的冒泡是有益的。事件冒泡的好处是,当一个元素上的事件被触发时,这个事件会 affects 更多元素,使得代码更加模块化与可维护。同时,事件冒泡可以让用户在浏览器中创建更复杂的交互行为,例如实现平滑滚动、全屏滚动等。
- 可以通过事件对象来取消冒泡 `event.cancelBubbl = true`
```html
<body>
<div id="box1" class="div"><button id="btn" >我是btn</button>
</div>
</body>
function myClick(elemId,fun) {
let btn = document.getElementById(elemId);
btn.onclick = fun;
}
window.onload = function(){
myClick("box1",function(){
alert("box1被点击...");
});
myClick("btn",function(){
alert("btn被点击...");
})
document.body.onclick = function(){
alert("body被点击...");
};
}
事件的委派
- 概念:
事件的委派
指将事件绑定给元素统一的祖先元素,这样当后代元素上的事件被触发是,会冒泡到祖先元素,从而通过祖先元素来处理事件。 - 事件委派的工作原理是,当一个子元素上的事件被触发时,事件处理程序会先检查事件是否在当前的DOM中,如果不是,则继续检查父元素上的事件处理程序。这样,当子元素上的事件被触发时,事件处理程序会 affects 更多元素,使得代码更加模块化与可维护。事件委派利用了事件冒泡,减少了事件绑定次数,提高了程序的性能。
event.target
指触发事件的对象
<button type="button" id="btn">添加超链接</button>
<ul id="ul">
<li ><a href="javascript:;" class="link">超链接</a></li>
<li ><a href="javascript:;" class="link">超链接</a></li>
<li ><a href="javascript:;" class="link">超链接</a></li>
</ul>
window.onload = function(){
var btn = document.getElementById("btn");
// 添加超链接
btn.onclick = function(){
let li = document.createElement("li");
li.innerHTML = "<li ><a href='javascript:;' class='link'>新超链接</a></li>";
ul.appendChild(li);
}
// 事件委派
var ul = document.getElementById('ul');
ul.onclick = function(e){
var event = e || window.event;
var target = event.target || event.srcElement;
if(target.className == 'link'){
alert(target.innerText);
}
}
}
事件的绑定
对象.事件=函数
绑定响应函数只能为一个元素的一个事件绑定一个响应函数。如果绑定了第一个,则后面的事件会覆盖前面的。
var btn = document.getElementsByTagName('button')[0];
btn.onclick = function(){
console.log('按钮被点击了');
}
btn.onmouseover = function(){
console.log('鼠标悬停在按钮上');
}
- 在JavaScript中,可以使用
addEventListener
方法进行事件绑定。addEventListener
方法接收三个参数:事件名称(不要加on)、事件处理程序和一个布尔值(一般为false),表示是否使用事件冒泡。
button.addEventListener('click', function() {//\\
console.log('按钮被点击了');
});
addEventListener
可以绑定多个事件
button.addEventListener('click', function() {
console.log('按钮被点击了');
}, false);
button.addEventListener('mouseover', function() {
console.log('鼠标悬停在按钮上');
}, false);
- 或者,可以使用数组将多个事件名称和事件处理程序传递给
addEventListener
方法:
button.addEventListener(['click', 'mouseover'], [function() {
console.log('按钮被点击了');
}, function() {
console.log('鼠标悬停在按钮上');
}], false);
- 如果浏览器不支持
addEventListener
方法, 可以使用attachEvent
方法替代。 - 注意,
attachEvent
只有前两个参数,且执行顺序相反,后绑定先执行。attachEvent()
中的this是绑定的对象,attentEvent()
中this是window
var x = document.getElementById("myBtn");
if (x.addEventListener) {
//所有主流浏览器,除了 IE 8 及更早 IE版本
x.addEventListener("click", myFunction);}
else if (x.attachEvent) {
// IE 8 及更早 IE 版本
x.attachEvent("onclick", myFunction);
}
//obj 要绑定的对象
//eventStr事件的字符串
//callback 回调函数
function bind(obj,eventStr,callback){
if (obj.addEventListener) {
//所有主流浏览器,除了 IE 8 及更早 IE版本
obj.addEventListener(eventStr, callback, false);
}
else if (obj.attachEvent) {
//IE 8 及更早 IE 版本
obj.attachEvent('on' + eventStr, function(){
//在匿名函数中调用回调函数
callback.call(obj);
});
}
}
事件的传播
- 事件的传播
- 事件捕获阶段:事件从最外层到最里层。此时默认不会触发事件
- 目标阶段:事件捕获到目标元素,捕获介绍开始在目标元素上触发
- 事件冒泡阶段:事件从最里层到最外层
- 事件冒泡:事件从里到外,从下到上
- 如果希望在捕获阶段就触发事件,可以将addEventListener的第三个参数设置为true(一般不推荐)。IE8以下没有捕获阶段
常用事件
- 鼠标事件
- 滚轮事件
onmousewheel
鼠标滚轮滚动事件,火狐不支持DOMMouseScroll
火狐的鼠标滚轮滚动事件,需要通过addEventListener()
绑定。addEventListener()
要使用event.preventDefault()
来取消浏览器默认行为(IE8浏览器不支持)event.wheelDelta
可获取鼠标滚轮滚动的方向,向上滚为240,向下为-240。火狐不支持event.detail
可获取鼠标滚轮滚动的方向(仅火狐支持),向上滚为-2,向下为2
window.onload = function(){
function bind(obj,eventStr,callback){
if (obj.addEventListener) {
//所有主流浏览器,除了 IE 8 及更早 IE版本 obj.addEventListener(eventStr, callback, false);
}
else if (obj.attachEvent) {
//IE 8 及更早 IE 版本
obj.attachEvent('on' + eventStr, function(){
//在匿名函数中调用回调函数
callback.call(obj);
});
}
}
let box1 = document.getElementById("box1");
//onmousewheel鼠标滚轮滚动事件,火狐不支持
box1.onmousewheel = function (event) {
// alert(event.wheelDelta);//获取鼠标滚动方向,火狐不支持
if (event.wheelDelta > 0 || event.detail < 0){
// alert("向上滚");
box1.style.height = box1.clientHeight - 10 +'px';
}else {
// alert("向下滚");
box1.style.height = box1.clientHeight + 10 +'px';
}
// 当滚动条存在,滚动是浏览器会默认滚动
event.preventDefault && event.preventDefault();
return false; }
//火狐需要使用DOMMouseScroll
bind(box1,'DOMMouseScroll',box1.onmousewheel);
}
- 键盘事件
onkeydown
当某个键盘被按下,可以连续触发。当连续触发,第一次与第二次间隔较长,目的是防止误操作。onkeyup
当某个键盘被松开,不会连续触发。keyCode
可以获取按键的编码altKey
ctrlKey
shiftKey
可以判断alt、ctrl、shift键是否被按下,如果按下就返回true,否则返回false
- 键盘事件一般绑定给可以获取节点的对象或document对象
- 如果在onkeydown中取消了默认行为,则输入的内容不会出现在文本框中(可以用来限制某些按键的输入)
input.onkeydown = function (event) {
event = event || window.event;
// 判断输入框中是否输入了数字
if (event.keyCode >= 48 && event.keyCode <= 57) {
return false;
}
}
练习
1 div随鼠标移动
- 要求
- 使div可以随鼠标移动
- 即使出现滚动条,div依然可以在可见屏幕移动
- 提示:clientX,scrollTop
<style>
#box1{
width: 100px;
height: 100px;
background-color: red;
position: absolute;
top: 0; */
}
</style>
<body style="height: 1000px;width: 2000px;">
<div id="box1"></div>
</body>
答案:
window.onload = function(){
var box1 = document.getElementById("box1");
let x = 0;
let y = 0;
let st = document.body.scrollTop || document.body.scrollTop;
let sl = document.body.scrollLeft || document.body.scrollLeft;
document.onmousemove = function(e){
e = e || window.e;
x = e.clientX;
y = e.clientY;
box1.style.left = x + sl + "px";
box1.style.top = y + + st + "px";
}
}
2 拖拽
- 要求
- 当前鼠标在被拖拽元素上按下时,开始拖拽
- 当鼠标移动时被拖拽元素随鼠标移动
- 当鼠标松开时,被拖拽元素固定在当前位置
- 问题
- 鼠标拖动位置:可以在div中任意位置拖动
- 浏览器的拖拽问题(ctrl+A):当拖拽网页内容时,浏览器去搜索引擎中搜索内容。如果不希望发送这种行为,可以通过return false来取消浏览器的默认行为(IE8不支持),IE8使用
setCapture
方法(部分其他浏览器使用该方法是会报错,需要判断)
<style>
#box{
width: 100px;
height: 100px;
background-color: red;
position: absolute;
left: 0;
top: 0;
}
</style>
<div id="box" class="div"></div>
window.onload = function () {
function drag(obj) {
obj.onmousedown = function (e) {
//兼容IE8
// if (box.setCapture){ // box.setCapture(); // } // Element.setCapture() 已弃用,请改用 Element.setPointerCapture() obj.setCapture && obj.setCapture();
// 获取鼠标在页面上的位置与元素框(例如一个 div)之间的距离
// e.clientX 和 e.clientY 分别表示鼠标在页面上的 x 和 y 坐标,box.offsetLeft 和 box.offsetTop 分别表示元素框相对于其父元素的左上角位置的距离
//div偏移量
let disX = e.clientX - obj.offsetLeft;
let disY = e.clientY - obj.offsetTop;
document.onmousemove = function (e) {
//两个e对象不一样,外面的e是事件对象,里面的e是鼠标对象
// 计算鼠标与元素框之间的距离
let l = e.clientX - disX;
let t = e.clientY - disY;
obj.style.left = l + 'px';
obj.style.top = t + 'px';
}
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
obj.releaseCapture && obj.releaseCapture();
}
return false;
}
}
let box = document.getElementById('box');
let box2 = document.getElementById("box2");
drag(box);
drag(box2);
}
3 div随方向键移动
let box1 = document.getElementById('box1');
document.onkeydown = function (event) {
event = event || window.event;
let speed = 10;
switch (event.keyCode){
case 37:
// alert("按下了向左键");
box1.style.left = box1.offsetLeft - speed + 'px';
break; case 38:
// alert("按下了向上键");
box1.style.top = box1.offsetTop - speed + 'px';
break; case 39:
// alert("按下了向右键");
box1.style.left = box1.offsetLeft + speed + 'px';
break; case 40:
// alert("按下了向下键");
box1.style.top = box1.offsetTop + speed + 'px';
break;
}
}
标签:function,obj,对象,事件,document,box1,event
From: https://www.cnblogs.com/flblogs/p/17615471.html