【JavaScript】事件绑定、事件解绑、常见事件类型、事件对象

事件

认识事件

    事件:捕获用户的行为
事件的三要素
            1. 事件源          绑定在谁身上的事件
            2. 事件类型        什么事件
            3. 事件处理函数     当触发了行为之后,发生的事情

    eg 
    div.onclick = function() {}

    事件源    div
    事件类型  click
    事件处理函数  function() {}

事件绑定

事件绑定方式

- DOM 0级 事件

        -> 语法   事件源.on事件类型 = 事件处理函数
        -> 特点   同一个事件源的同一个事件类型只能绑定一个事件处理函数

- DOM 2级 事件(事件侦听器 事件监听)

        -> 语法   事件源.addEventListener('事件类型', 事件处理函数)
        -> 特点   可以个同一个事件源的同一个事件类型绑定多个事件处理函数,会按照顺序依次触发
  // dom 0级事件

var div = document.querySelector("div");

  //   div.onclick = function () {
  //     console.log("绑定了一个点击事件");
  //   };

  //   div.onclick = function () {
  //     console.log("再绑定一个事件");
  //   };

  // dom 2级事件

  div.addEventListener("click", function () {
    console.log("绑定一个点击事件");
  });

  function clickFn() {
    console.log("再绑定一个点击事件");
  }
  div.addEventListener("click", clickFn);

事件解绑

解绑dom0级事件

    - 语法  事件源.on事件类型 = null

解绑dom2级事件

    - 语法  事件源.removeEventListener('事件类型', 要解绑的事件处理函数)
    - 注意  如果用dom2级解绑, 绑定的时候的事件处理函数必须要在外面单独定义,用函数名的形式进行绑定
// 给div绑定0级事件
  var div = document.querySelector("div");
  div.onclick = function () {
    console.log("绑定0级事件");
  };

  var btn = document.querySelector("button");
  btn.onclick = function () {
    div.onclick = null;
  };

// 给div绑定2级事件
var div = document.querySelector("div");
var clickFn = function () {
  console.log("绑定dom2级事件");
};

div.addEventListener("click", clickFn);
var btn = document.querySelector("button");

btn.onclick = function () {
  div.removeEventListener("click", clickFn);
};

常见的事件类型

1. 鼠标事件

click 鼠标左键点击
dblclick 鼠标左键双击
contextmenu 鼠标右键单击
mousedown 鼠标按下
mouseup 鼠标抬起
mousemove 鼠标移动
mouseover 鼠标移入
mouseout 鼠标移出
mouseenter 鼠标移入事件
mouseleave 鼠标离开
<style>
      div {
        width: 100px;
        height: 100px;
        background-color: pink;
        overflow: hidden;
      }
      p {
        padding: 0;
        margin: 0;
        width: 50px;
        height: 50px;
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <div>
      <p></p>
    </div>
  </body>
<script>
  /*
    鼠标事件
  */
  var div = document.querySelector("div");
  // * 1. click 鼠标左键点击
    div.onclick = function () {
      console.log("鼠标左键点击");
    };


  // 2. dblclick 鼠标左键双击
  // 是要是300ms内有两次click就会触发双击
    div.ondblclick = function () {
      console.log("鼠标左键双击");
    };


  // *  3. contextmenu 鼠标右键单击
    div.oncontextmenu = function () {
      console.log("鼠标右键单击");
    };


  //  * 4. mousedown 鼠标按下
    div.onmousedown = function () {
      console.log("鼠标按下");
    };


  // *  5. mouseup 鼠标抬起
    div.onmouseup = function () {
      console.log("鼠标抬起");
    };


  // * 6. mousemove 鼠标移动
    div.onmousemove = function () {
      console.log("鼠标移动");
    };


  // 7. mouseover 鼠标移入
  // 注意  mouseover 和 mouseout 在鼠标移入到子元素上依然可以触发
    div.onmouseover = function () {
      console.log("鼠标移入");
    };


  //   // 8. mouseout 鼠标移出
    div.onmouseout = function () {
      console.log("鼠标移出");
    };


  // * 9. mouseenter 鼠标移入事件
  mouseenter 和 mouseleave 在鼠标移入子元素的时候,不会触发
    div.onmouseenter = function () {
      console.log("鼠标移入事件");
    };


  // *  // 10. mouseleave 鼠标离开
    div.onmouseleave = function () {
      console.log("鼠标离开");
    };
</script>

2. 键盘事件

keydown 键盘按下事件
keyup 键盘抬起
keypress 键盘键入事件
    - 可以给所有元素绑定键盘事件, 不是所有元素都能触发键盘事件
    - 一般给 window/document/表单元素 绑定键盘元素
    - 键盘事件不考虑中文
var inp = document.querySelector("input");
  // 1. keydown 键盘按下事件
    inp.onkeydown = function () {
      console.log("键盘按下事件");
    };

  // 2. keyup 键盘抬起
    inp.onkeyup = function () {
      console.log("键盘抬起");
    };

  // 3. keypress 键盘键入事件
  // 注意  按下的内容必须和出现的内容一致
  inp.onkeypress = function () {
    console.log("键盘键入事件");
  };

3. 浏览器事件

4. 表单事件

focus 表单空间获取焦点
blur 表单失去焦点
change 表单内容改变
input 表单输入事件
submit 表单提交
reset 表单重置
<body>
    <form action="./00-回顾.html">
      <!-- <input type="text" /> -->
      <input type="text" value="小花" />
      <button type="submit">提交</button>
      <button type="reset">重置</button>
    </form>
  </body>
<script>
  /*
    表单事件
  */


  var inp = document.querySelector("input");
  var form = document.querySelector("form");


  // 1. focus 表单空间获取焦点
  //   inp.onfocus = function () {
  //     console.log("表单空间获取焦点");
  //   };


  //   // 2. blur 表单失去焦点
  //   inp.onblur = function () {吃饭啦
  //     console.log("表单失去焦点");
  //   };


  // 3. change 表单内容改变
  // 注意  文本框 要求获取焦点和失去焦点内容不一样的时候会触发
  //   inp.onchange = function () {
  //     console.log("表单内容改变");
  //   };


  // 4. input 表单输入事件
  // 注意  只要输入或删除就会触发
  //   inp.oninput = function () {
  //     console.log("表单输入事件");
  //   };


  // 表单 提交 和 重置 都必须绑定在form表单域上面
  // 5. 表单提交 submit
  form.onsubmit = function () {
    console.log("表单提交");
    // 禁止默认行为  刷新页面
    return false;
  };
  // 6. 表单重置 reset
  form.onreset = function () {
    console.log("表单重置");
  };
</script>

5. 触摸事件

touchstart 开始触摸
touchmove 触摸移动
touchend 触摸结束
var div = document.querySelector("div");

// 1. touchstart 开始触摸
div.ontouchstart = function () {
  console.log("开始触摸");
};

// 2. touchmove 触摸移动
div.ontouchmove = function () {
  console.log("触摸移动");
};

// 3. touchend 触摸结束
div.ontouchend = function () {
  console.log("触摸结束");
};

6. 拖拽事件

dragstart 开始拖拽
drag 拖拽移动
dragend 拖拽结束
dragenter 拖拽元素进入拖放元素范围内触发
dragleave 拖拽元素离开拖放元素范围触发
dragover 拖拽元素完全进入元素范围内触发
drop 拖拽元素在拖放元素范围内放手的时候触发

拖拽事件
- 拖拽关联两个元素
1. 拖拽元素 正在拖着的元素
2. 拖放元素 将要松手放置的元素
- 如何让一个元素可以被拖拽
置一个属性 draggable = ‘true’

 <style>
      div {
        width: 200px;
        height: 200px;
        background-color: pink;
      }
      p {
        width: 300px;
        height: 300px;
        background-color: green;
      }
    </style>
  </head>
  <body>
    <!-- 设置  draggable 属性 让元素可以拖拽 -->
    <div draggable="true"></div>
    <p draggable="true"></p>
  </body>
<script>

  var div = document.querySelector("div");
  var p = document.querySelector("p");
  // 1. dragstart 开始拖拽
  //   div.ondragstart = function () {
  //     console.log("开始拖拽");
  //   };

  //   // 2. drag 拖拽移动
  //   div.ondrag = function () {
  //     console.log("正在拖着走");
  //   };

  //   // 3. dragend 拖拽结束
  //   div.ondragend = function () {
  //     console.log("拖拽结束");
  //   };

  // 4. dragenter 拖拽元素进入拖放元素范围内触发
  //   p.ondragenter = function () {
  //     console.log("把别的元素拖进来");
  //   };

  //   // 5. dragleave 拖拽元素离开拖放元素范围触发
  //   p.ondragleave = function () {
  //     console.log("把别的元素拖走了");
  //   };

  // 6. dragover 拖拽元素完全进入元素范围内触发
  p.ondragover = function () {
    console.log("拖进来了");
    // 阻止默认行为
    return false;
  };

  // 7. drop  拖拽元素在拖放元素范围内放手的时候触发
  // 注意  如果想要让drop事件生效, 需要阻止 dragover事件的默认行为
  p.ondrop = function () {
    console.log("把元素拖进来撒手");
  };
</script>

事件对象

    - 当事件行为发生的时候,浏览器主动记录的一个对象数据,内部存储了关于本次事件的相关信息

获取事件对象

- 标准浏览器
        在事件处理函数有一个参数,参数就是事件对象
- IE浏览器
        IE浏览器天生有一个事件对象 window.event
<style>
      div {
        width: 200px;
        height: 200px;
        background-color: pink;
      }
    </style>
  </head>
  <body>
    <div></div>
</body>
<script>
  var div = document.querySelector("div");
  // 标准浏览器
  div.onclick = function (e) {
    console.log(e);
  };

  // IE 浏览器事件对象
  div.onclick = function () {
    console.log(window.event);
  };

  // 兼容性操作
  div.onclick = function (e) {
    var e = e || window.event;
  };
</script>

鼠标事件对象

1. client
        - 语法 
             entX
                             事件对象.clientY
        - 光标相对于浏览器可视窗口左上角的坐标点
2. page
        - 语法 
             eX
                             事件对象.pageY
        - 光标相对于文档流左上角的坐标点
3. offset
        - 语法 
             setX
                             事件对象.offsetY
        - 光标相对于 准确触发事件的元素 左上角的坐标点
<style>
      * {
        margin: 0;
        padding: 0;
      }
      div {
        width: 200px;
        height: 300px;
        background-color: pink;
        margin: 100px;
        margin-top: 700px;
      }
</style>
<body>
    <div></div>
</body>
<script>
   var div = document.querySelector("div");
  div.onclick = function (e) {
    // 光标相对于浏览器可视窗口左上角的坐标点
    console.log("e.clientX, e.clientY");
    console.log(e.clientX, e.clientY);
    console.log("==========================");
    // 光标相对于文档流左上角的坐标点
    console.log("e.pageX, e.pageY");
    console.log(e.pageX, e.pageY);

    console.log("==================");
    //  光标相对于 准确触发事件的元素 左上角的坐标点
    console.log("e.offsetX, e.offsetY");
    console.log(e.offsetX, e.offsetY);
  };
</script>

鼠标坐标点

// 0 获取元素
var xBox = document.querySelector(".x");
var yBox = document.querySelector(".y");


document.onmousemove = function (e) {
  var x = e.clientX;
  var y = e.clientY;

  // 把 x 和 y 放到span中
  xBox.innerHTML = x;
  yBox.innerHTML = y;
};
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue 的组件是一个自包含的模块,它可以通过自定义事件来实现组件之间的通信。在 Vue 中,可以通过 `$emit` 方法触发自定义事件,使用 `$on` 方法监听自定义事件。 以下是一个示例代码: ```vue <template> <div> <button @click="emitEvent">触发自定义事件</button> </div> </template> <script> export default { methods: { emitEvent() { this.$emit('custom-event', 'custom-data') } } } </script> ``` 在父组件中,可以使用 `$on` 方法来监听自定义事件: ```vue <template> <div> <child-component @custom-event="handleCustomEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, methods: { handleCustomEvent(data) { console.log('接收到自定义事件', data) } } } </script> ``` 如果需要在组件销毁时解绑自定义事件监听器,可以使用 `$off` 方法,例如: ```vue <template> <div> <button @click="bindEvent">绑定自定义事件</button> <button @click="unbindEvent">解绑自定义事件</button> </div> </template> <script> export default { methods: { bindEvent() { this.$on('custom-event', this.handleCustomEvent) }, unbindEvent() { this.$off('custom-event', this.handleCustomEvent) }, handleCustomEvent(data) { console.log('接收到自定义事件', data) } } } </script> ``` 需要注意的是,在解绑自定义事件时,需要传入事件名称和事件处理函数。如果不传入事件处理函数,则会将该事件名称下的所有事件处理函数都解绑。此外,当组件销毁时,所有自定义事件监听器都会自动解绑,无需手动调用 `$off` 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒果Cake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值