前端开发让前端飞Web前端之路

基础知识--javascript事件机制与事件委托

2018-01-22  本文已影响82人  Husbin

事件:

事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。javascript与HTML之间的交互就是通过事件来实现的。观察者模型:使用侦听器或处理程序要预定时间,以便时间发生时执行相应的代码,这种模型支持页面的行为(javascript)与页面的外观(HTML和CSS)之间的松散耦合。

事件监听器与处理程序:

<div id="child" style="width: 90px;height:90px;background-color: cyan;margin: 0 auto;" onclick="showMessage(event)" >孩子</div>
<script type="text/javascript">
    function showMessage(event){
        alert(event.target.id);
    }
 </script> 
<div id="child" style="width: 90px;height:90px;background-color: cyan;margin: 0 auto;" >孩子</div>
<script type="text/javascript">
    let child = document.getElementById("child");
    /**
     *  事件监听器
     *  addEventListener(eventName , dealEventFunc , boolean)
     *  eventName: 要处理的事件名
     *  dealEventFunc: 作为事件处理程序的函数
     *  boolean: true表捕获事件,false表冒泡事件
     * */
    // 捕获事件流
    child.addEventListener("click",function () {
        //取消冒泡
        //event.stopPropagation();          //IE
        //event.cancelBubble = true;        //w3c
        console.log("捕获事件流:click child!");
    },true);
    //冒泡事件流
    child.addEventListener("click",function () {
        console.log("冒泡事件流:click child!");
    },false);
</script>

事件流:

image.png
  1. IE事件流:事件冒泡流。

事件开始时由最具体的元素(文档中嵌到层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

image.png image.png image.png
  1. NetSpace事件流:事件捕获流。

事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件,事件捕获的用意在于在事件到达预定目标之前捕获他。

image.png image.png image.png
  1. DOM事件流:包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

DOM2级事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会,然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。

下图,捕获阶段:1,2,3,4

处于目标阶段在事件处理中被看成是冒泡阶段的一部分

然后冒泡事件发生:5,6,7,8,9

image.png

阻止事件冒泡

        event.stopPropagation();          //IE
        event.cancelBubble = true;        //w3c
image.png

事件委托

<!DOCTYPE html>
<html lang="en" id="html" onclick="clickDiv(event)">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body id="body">
<div id="grandparent" style="width: 270px;height:270px;background-color: blue; margin: 0 auto; text-align: center;line-height: 3">祖父
    <div id="parent" style="width: 180px;height:180px;background-color: cadetblue;margin: 0 auto;">父亲
        <div id="child" style="width: 90px;height:90px;background-color: cyan;margin: 0 auto;" >孩子
        </div>
    </div>
</div>
</body>
<script type="text/javascript">
    let child = document.getElementById("child");
    let parent = document.getElementById("parent");
    let grandparent = document.getElementById("grandparent");
    let body = document.getElementById("body");
    let html = document.getElementById("html");
    function clickDiv(event){
        switch (event.target.id){
            case 'child':console.log("click child!");break;
            case 'parent':console.log("click parent!");break;
            case 'grandparent':console.log("click grandparent!");break;
            case 'body':console.log("click body!");break;
            case 'html':console.log("click html!");break;
        }
    }
</script>
</html>
image.png
<!DOCTYPE html>
<html lang="en" id="html" onclick="clickDiv(event)">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body id="body">
<div id="grandparent" style="width: 270px;height:270px;background-color: blue; margin: 0 auto; text-align: center;line-height: 3">祖父
    <div id="parent" style="width: 180px;height:180px;background-color: cadetblue;margin: 0 auto;">父亲
        <div id="child" style="width: 90px;height:90px;background-color: cyan;margin: 0 auto;" >孩子
        </div>
    </div>
</div>
<!--<div id="child" style="width: 90px;height:90px;background-color: cyan;margin: 0 auto;" onclick="showMessage(event)" >孩子-->
<!--</div>-->
</body>
<script type="text/javascript">
    let child = document.getElementById("child");
    let parent = document.getElementById("parent");
    let grandparent = document.getElementById("grandparent");
    let body = document.getElementById("body");
    let html = document.getElementById("html");

    //采用事件委托优化性能
    function clickDiv(event){
        switch (event.target.id){
            case 'child':console.log("click child!");break;
            case 'parent':console.log("click parent!");break;
            case 'grandparent':console.log("click grandparent!");break;
            case 'body':console.log("click body!");break;
            case 'html':console.log("click html!");break;
        }
    }
    // function showMessage(event){
    //     alert(event.target.id);
    // }
    /**
     *  事件监听器
     *  addEventListener(eventName , dealEventFunc , boolean)
     *  eventName: 要处理的事件名
     *  dealEventFunc: 作为事件处理程序的函数
     *  boolean: true表捕获事件,false表冒泡事件
     * */
    // 捕获事件流
    // child.addEventListener("click",function () {
    //     console.log("捕获事件流:click child!");
    // },true);
    // parent.addEventListener("click",function () {
    //     console.log("捕获事件流:click parent!");
    // },true);
    // grandparent.addEventListener("click",function () {
    //     console.log("捕获事件流:click grandparent!");
    // },true);
    // body.addEventListener("click",function () {
    //     console.log("捕获事件流:click body!");
    // },true);
    // html.addEventListener("click",function () {
    //     console.log("捕获事件流:click html!");
    // },true);
    // document.addEventListener("click" , function () {
    //     console.log("捕获事件流:click document!")
    // },true);
    // window.addEventListener("click" , function (ev) {
    //     console.log("捕获事件流:click window!")
    // },true);

    //冒泡事件流
    // child.addEventListener("click",function (event) {
    //     console.log("冒泡事件流:click child!");
    //     //阻止冒泡行为
    //     //event.stopPropagation();          //IE
    //     event.cancelBubble = true;        //w3c
    // },false);
    // parent.addEventListener("click",function () {
    //     console.log("冒泡事件流:click parent!");
    // },false);
    // grandparent.addEventListener("click",function () {
    //     console.log("冒泡事件流:click grandparent!");
    // },false);
    // body.addEventListener("click",function () {
    //     console.log("冒泡事件流:click body!");
    // },false);
    //
    // html.addEventListener("click",function () {
    //     console.log("冒泡事件流:click html!");
    // },false);
    // document.addEventListener("click" , function () {
    //     console.log("冒泡事件流:click document!");
    // },false);
    // window.addEventListener("click" , function (ev) {
    //     console.log("冒泡事件流:click window!");
    // },false);
</script>
</html>
上一篇 下一篇

猜你喜欢

热点阅读