dom事件

。_饼干妹妹 提交于 2020-03-05 00:59:25

一:注册事件(绑定事件)
注册事件有两种方式:
a.传统方式
b.方法监听注册方式

二:优缺点
a.传统注册:

  • 利用on开头的事件 eg: onclick,onmouseove…
  • <button onclick="alert('hi~')" ></button>
  • btn.onclick = function() {}
  • 特点:注册事件的唯一性
  • 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数

b.方法监听注册:

  • w3c 标准 推荐方式
  • addEventListener() 是一个方法
  • IE9之前的IE不支持此方法,可使用attachEvent()代替
  • 特点:同一个元素同一个事件可注册多个事件(监听器)
  • 按注册顺序依次执行

三:addEventListener()监听方式 (具有兼容性问题,IE9以上支持)
1.eventTarget.addEventListener(type, listener[, useCapture])
2.此方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数

  • type: 事件类型字符串,如 click,mousedown(这里不需要带on
  • listener:事件处理函数,事件发生时,会调用该监听函数
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button>传统方式</button>
    <button>事件侦听方式</button>

    <script>
        // 1.传统方式
        var btns = document.querySelectorAll('button');
        btns[0].onclick = function() {
            alert('1');
        }
        btns[0].onclick = function() {
                alert('2');
            }
            // 只弹出第二个事件函数
            // 2.事件侦听方法
        btns[1].addEventListener('click', function() {
            alert('11');
        })
        btns[1].addEventListener('click', function() {
            alert('22');
        })
    </script>
</body>

</html>

四:删除事件(解绑事件)
4.1传统方式删除事件:
eventTarget.onclick = null;
4.2方法监听注册事件:
1.eventTarget.removeEventListener(type, listener[,useCapture]);

自学小demo:拖动模态框

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>拖动模态框</title>
    <style>
        ul,
        li,
        ol,
        dl,
        dt,
        dd,
        div,
        p,
        span,
        h1,
        h2,
        h3,
        h4,
        h5,
        h6,
        a {
            margin: 0;
            padding: 0;
        }
        
        a {
            text-decoration: none;
            color: #000;
        }
        
        .login-header {
            width: 100%;
            text-align: center;
            font-size: 24px;
            height: 30px;
            line-height: 30px;
        }
        
        .login {
            display: none;
            position: fixed;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 512px;
            height: 280px;
            border: 1px solid #ebebeb;
            background-color: #fff;
            box-shadow: 0 0 20px #ddd;
            z-index: 99;
        }
        
        .login-title {
            position: relative;
            width: 100%;
            text-align: center;
            height: 40px;
            line-height: 40px;
            font-size: 18px;
            cursor: move;
        }
        
        .login-input-content {
            margin-top: 20px;
        }
        
        .login-button {
            width: 50%;
            text-align: center;
            line-height: 40px;
            margin: 30px auto 0px auto;
            font-size: 14px;
            border: 1px solid #ebebeb;
        }
        
        .login-button a {
            display: block;
        }
        
        .login-input input.list-input {
            float: left;
            line-height: 35px;
            height: 35px;
            width: 350px;
            text-indent: 5px;
            border: 1px solid #ebebeb;
        }
        
        .login-input {
            /* 清除浮动 */
            overflow: hidden;
            margin: 0 0 20px 0;
        }
        
        .login-input label {
            float: left;
            width: 90px;
            padding-right: 10px;
            line-height: 35px;
            text-align: right;
            height: 35px;
            font-size: 14px;
        }
        
        .login-bg {
            display: none;
            width: 100%;
            height: 100%;
            position: fixed;
            left: 0;
            top: 0;
            background: rgba(0, 0, 0, .2);
        }
        
        .login-title span {
            position: absolute;
            right: -20px;
            top: -30px;
            width: 40px;
            height: 40px;
            font-size: 12px;
            border-radius: 20px;
            border: 1px solid #ebebeb;
            background-color: #fff;
        }
    </style>
</head>

<body>
    <!-- 标题 -->
    <div class="login-header">
        <a id="link" href="javascript:;">点击,弹出登录框</a>
    </div>
    <!-- 登录部分 -->
    <div class="login" id="login">
        <!-- 标题 -->
        <div class="login-title" id="title">
            登录会员
            <span><a href="javascript:;" id="closeBtn" class="close-login">关闭</a></span>
        </div>

        <div class="login-input-content">
            <!-- 用户名 -->
            <div class="login-input">
                <label for="">用户名:</label>
                <input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">
            </div>
            <!-- 登录密码 -->
            <div class="login-input">
                <label for="">登录密码:</label>
                <input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">
            </div>
            <div class="login-button" id="loginBtn">
                <a href="javascript:;" class="login-button-submit">登录会员</a>
            </div>
        </div>
    </div>
    <div class="login-bg" id="bg"></div>

    <script>
        // 需求一:显示隐藏登录和遮罩层模块
        var link = document.querySelector('#link');
        var closeBtn = document.querySelector('#closeBtn');
        var login = document.querySelector('.login');
        var mask = document.querySelector('.login-bg');
        var title = document.querySelector('#title');
        link.addEventListener('click', function() {
            login.style.display = 'block';
            mask.style.display = 'block';
        })
        closeBtn.addEventListener('click', function() {
                login.style.display = 'none';
                mask.style.display = 'none';
            })
            // 需求二: 拖动模态框: 鼠标按下获得鼠标在login中的坐标并保持不变 再鼠标移动, 获取login盒子距离页面的位置大小( 使用鼠标在页面的坐标减去鼠标在盒子内的坐标) 鼠标弹起不在拖动模态框
            // 事件源是title
        title.addEventListener('mousedown', function(e) {
            var x = e.pageX - login.offsetLeft;
            var y = e.pageY - login.offsetTop;
            document.addEventListener('mousemove', move)

            function move(e) {
                // 注意此处勿忘记加单位px
                login.style.left = e.pageX - x + 'px';
                login.style.top = e.pageY - y + 'px';
            }
            // 鼠标弹起,解除鼠标移动事件
            document.addEventListener('mouseup', function() {
                document.removeEventListener('mousemove', move);
            })
        })
    </script>
</body>

</html>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!