万象更新 Html5 - dom: DOM 事件

源码 https://github.com/webabcd/Html5
作者 webabcd

万象更新 Html5 - dom: DOM 事件

示例如下:

dom\demo3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM 事件</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            font-size: 14px;
        }

        .class1 {
            background-color: orange;
            color: white;
            height: 30px;
            margin-bottom: 20px;
        }

        .class2 {
            background-color: orange;
            width: 800px;
            height: 800px;
            display: flex;
            align-items:center;
            justify-content:center;
        }

        .class2 div {
            background-color: red;
            width: 600px;
            height: 600px;
            color: white;
            display: flex;
            align-items:center;
            justify-content:center;
        }

    </style>
</head>
<body>

<!--绑定事件的第 1 种写法-->
<div id="div1" class="class1" onclick="this.innerHTML = 'onclick';">
    i am a div
</div>

<div id="div2" class="class2">
    <div id="div3">
        i am a div
    </div>
</div>

<script>
    let div1 = document.querySelector("#div1");
    // 绑定事件的第 2 种写法
    div1.onmouseover = () => {
        div1.innerHTML = "onmouseover";
    };
    // 绑定事件的第 3 种写法
    // 通过 addEventListener() 可以为指定的事件绑定指定的监听器(并且支持为一种事件绑定多个不同的监听器)。注:这里指定的事件是不用加“on”的
    // 注:addEventListener() 还有第 3 个参数,其默认是 false(事件流是冒泡的方式,即从里到外),需要的话可以传 true(事件流是捕获的方式,即从外到里)
    // 通过 removeEventListener() 可以解绑事件
    div1.addEventListener("mouseout", div1_click_1);
    div1.addEventListener("mouseout", div1_click_2);
    // div1.removeEventListener("mouseout", div1_click_1);
    // div1.removeEventListener("mouseout", div1_click_2);
    function div1_click_1() {
        div1.innerHTML = "onmouseout(div1_click_1)";
    }
    function div1_click_2() {
        div1.innerHTML += "onmouseout(div1_click_2)";
    }



    let div2 = document.querySelector("#div2");
    let div3 = document.querySelector("#div3");
    div2.addEventListener("click", div2_click);
    div3.addEventListener("click", div3_click_1);
    div3.addEventListener("click", div3_click_2);

    // div2 被点击,或者 div3 被点击之后冒泡过来
    // 如果点击了 div3,并在 div3 的点击监听器中调用了 event.stopPropagation() 或 event.stopImmediatePropagation(),则不会执行到这里
    function div2_click(event) {
        // 如果事件是冒泡过来的话,可以通过 event.target 获取触发此事件的元素
        div3.innerHTML += `div2_click, this.id:${this.id}, event.target:${event.target.id}<br />`;
        // 注: offsetX, offsetY 指的是相对于 event.target 的位置
        div3.innerHTML += `div2_click, offsetX:${event.offsetX}, offsetY:${event.offsetY}<br />`;
    }

    // div3 被点击
    function div3_click_1(event) {
        div3.innerHTML = "div3_click_1<br />";
        // offsetX, offsetY - 点击位置相对于 触发此事件的元素 的位置
        div3.innerHTML += `offsetX:${event.offsetX}, offsetY:${event.offsetY}<br />`;
        // pageX, pageY - 点击位置相对于 整个文档 的位置(不会随滚动条的滚动而变化)
        div3.innerHTML += `pageX:${event.pageX}, pageY:${event.pageY}<br />`;
        // clientX, clientY - 点击位置相对于 文档可视区 的位置(会随滚动条的滚动而变化)
        div3.innerHTML += `clientX:${event.clientX}, clientY:${event.clientY}<br />`;
        // screenX, screenY - 点击位置相对于 屏幕 的位置
        div3.innerHTML += `screenX:${event.screenX}, screenY:${event.screenY}<br />`;
        // ctrlKey, altKey, shiftKey - 是否按下了 ctrl, alt, shift 键
        div3.innerHTML += `ctrlKey:${event.ctrlKey}, altKey:${event.altKey}, shiftKey:${event.shiftKey}<br />`;

        /*
         * event.preventDefault() - 阻止当前事件的默认行为(比如,通过此方法可以阻止点击后选中复选框)
         * event.stopImmediatePropagation() - 阻止当前事件的冒泡和捕获,并阻止同事件的其他事件监听器被调用
         * event.stopPropagation() - 阻止当前事件的冒泡和捕获
         */
    }

    // div3 被点击
    function div3_click_2(event) {
        // 如果点击了 div3,并在 div3 的之前的点击监听器中调用了 event.stopImmediatePropagation(),则不会执行到这里
        div3.innerHTML += "div3_click_2<br />";
    }



    // 监听键盘的按下事件
    document.onkeydown = (event) => {
        // 获取按键的 key 和 code
        alert(`onkeydown, key:${event.key}, code:${event.code}`);
    };



    // 判断当前浏览器是否支持某个事件
    // 是否支持 onkeydown 事件
    var support_keydown = 'onkeydown' in window;
    alert("support_keydown:" + support_keydown);



    // visibilitychange - 当浏览器的某个标签页切换到后台,或从后台切换到前台时会触发此事件
    // 注:页面首次加载时是不会走到此事件的
    document.addEventListener("visibilitychange", () => {
        if (document.hidden) {
            console.log('页面到后台了 ' + new Date().getTime());
        }
        else {
            console.log('页面到前台了 ' + new Date().getTime());
        }
    });

</script>

</body>
</html>

源码 https://github.com/webabcd/Html5
作者 webabcd

posted @ 2024-09-24 10:53  webabcd  阅读(8)  评论(0编辑  收藏  举报