16-JS 事件监听、事件委托、拖拽事件、正则表达式

1.事件监听以及移除事件监听

可以向一个元素添加多次点击事件,后一个点击事件不会覆盖前一个点击事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
        }
    </style>
</head>
<body>
    <div id="box"></div>

    <script>

        oDiv = document.getElementById('box');
        // oDiv.onclick = function(){
        //       console.log(1)
        // }
        // oDiv.onclick = function(){
        //       console.log(2)
        // }
        // oDiv.onclick = function(){
        //       console.log(3)
        // }


        /*
         事件监听:可以向一个元素添加多次点击事件,后一个点击事件不会覆盖前一个点击事件
         obj.addEventListener('click',function(){},false)
         参数1  事件
         参数2  事件的执行函数
         参数3  boolean值,默认是false,明确了该事件是在捕获阶段执行还是在冒泡阶段执行
                false代表在冒泡阶段执行,true代表在捕获阶段执行(可不写)
        */
    //    oDiv.addEventListener('click',fn1,false);
    //    oDiv.addEventListener('click',fn2,false);
    //    oDiv.addEventListener('click',fn3,false);



    //    IE9以下添加事件监听
        //  oDiv.attachEvent('onclick',fn1);
        //  oDiv.attachEvent('onclick',fn2);
        //  oDiv.attachEvent('onclick',fn3);





        addEventListener(oDiv,'click',fn1,false)
        addEventListener(oDiv,'click',fn2,false)
        addEventListener(oDiv,'click',fn3,false)
        // 事件监听的兼容
        function addEventListener(obj,event,fn,bool){
              if (obj.addEventListener){
                  obj.addEventListener(event,fn,bool) 
              }else if(obj.attachEvent){
                  obj.attachEvent('on' + event,fn)
              }
        }





        // 移除事件监听器
        // oDiv.removeEventListener('click',fn1,false);
        // oDiv.detachEvent('onclick',fn1)       IE9以下


        // 移除事件监听器的兼容写法
        function removeEventListener(obj,event,fn,bool){
            if(obj.removeEventListener){
                obj.removeEventListener(event,fn,bool)
            }else if(obj.detachEvent){
                obj.detachEvent('on' + event,fn)
            }
        }
  
        removeEventListener(oDiv,'click',fn1)



        function fn1(){
            console.log('fn1')
        }
        function fn2(){
            console.log('fn2')
        }
        function fn3(){
            console.log('fn3')
        }
    </script>
</body>
</html>

2.事件委托

事件委托也叫事件代理,事件代理就是把原本需要绑定在子元素的响应事件(‘click’,‘keydown’,…)委托给父元素,让父元素担当事件监听的职务;
原理 : 就是Dom元素的事件冒泡
优点:

​ 1.可以大量节省内存占用,减少事件注册

​ 2.可以实现新增子元素时无需对新增元素绑定事件(动态绑定事件)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <ul id="oul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>

    <script>

        /* 
        事件委托也叫事件代理,事件代理就是把原本需要绑定在子元素的响应事件('click','keydown',...)
        委托给父元素,让父元素担当事件监听的职务;
        原理  就是Dom元素的事件冒泡

        优点:
        1.可以大量节省内存占用,减少事件注册
        2.可以实现新增子元素时无需对新增元素绑定事件(动态绑定事件)
        */

        var oUl = document.getElementById('oul');
        oUl.onclick = function(evt){
            var e = evt || window.event;
            // 获取事件源
            // console.log(e.target);   //标准浏览器
            // console.log(e.srcElement)    //IE


            // 获取事件源的兼容写法
            var target = e.target || e.srcElement;
            console.log(target.innerHTML);

        }
    </script>
</body>
</html>

3.拖拽事件

鼠标按下,求出鼠标的相对坐标值
鼠标移动,对象的left=鼠标的绝对坐标值-相对坐标值+‘px’
鼠标弹出,取消鼠标移动事件 = null

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
        }
    </style>
</head>
<body>
    <div id="box"></div>

    <script>
        /* 
        鼠标按下,求出鼠标的相对坐标值
        鼠标移动,对象的left=鼠标的绝对坐标值-相对坐标值+'px'
        鼠标弹出,取消鼠标移动事件 = null
        */

        var oDiv = document.getElementById('box');
        oDiv.onmousedown = function(evt){
            var e = evt || window.event;
            // console.log(e.offsetX,e.offsetY)
            var disX = e.offsetX;
            var disY = e.offsetY;
            // 鼠标在页面上移动
            document.onmousemove = function(evt){
                var e = evt || window.event;
                // console.log(e.pageX,e.pageY)

                oDiv.style.left = e.pageX - disX + 'px';
                oDiv.style.top = e.pageY - disY + 'px'; 
            }

            // 鼠标弹起,停止拖拽
            document.onmouseup = function(){
                document.onmousemove = null;
            }
        }
    </script>
</body>
</html>

4.正则表达式

网址:https://tool.chinaz.com/tools/regexgenerate
正则表达式:匹配字符串的一组规则
作用:常用于表达式验证

4.1如何创建正则表达式?
1.字面量方法 /正则表达式/标志位
2.构造函数方式 new RegExp(‘正则表达式’,‘标志位’)
4.2正则表达式的方法
1.正则表达式.test(字符串); //判断字符串中是否包含正则的内容,如果包含返回true,否则返回false
2.正则表达式对象.exec(字符串);//返回伪数组,如果没有匹配到正则表达式,返回null
4.3检测正则表达式的字符串的方法
1.字符串对象.match(正则表达式) 返回伪数组,如果没有匹配到正则表达式返回null
2.字符串对象.replace(‘正则表达式’,新字符串) 替换字符串
3.字符串.search(正则表达式) 查找正则匹配到字符串在父串中第一次出现的下标位置,没有匹配到 返回-1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" name="txt" id="txt" value="">

    <script>

        // var reg = /^\s+$/;   //空白字符
        // // var reg1 = new RegExp('^s+&')

        // var str='    ';
        // console.log(reg.test(str));




        // var str = prompt('请输入一组规则');
        // var re = new RegExp(str);

        // var otxt = document.getElementById('txt');
        // otxt.onblur = function(){
        //     var str = otxt.value;
        //     if(re.test(str)){
        //         window.close()
        //     }
        // }





        // var str = 'how do you do';
        // var reg = /do/;
        // console.log(str.match(reg));
        // console.log(str.replace(reg,'de'));    //替换how de you do

        // console.log(str.search(reg));  //4




        /* 无标志位 */
        // var reg = /o/;
        // var str = 'how are you hello';
        // console.log(reg.exec(str));   //['o']
        // console.log(str.match(reg));   //['o']






        // /* 有标志位g    g表示查找所有可能的匹配global*/
        // var reg = /o/g;
        // var str = 'how are you hello';
        // console.log(reg.exec(str));   //['o']
        // console.log(str.match(reg));   //['o','o','o']





        /* 有标志位i   i表示匹配的时候不区分大小写*/
        var reg = /o/i;
        var str = 'hOw are yOu hellO';
        console.log(reg.exec(str));   //['o']
        console.log(str.match(reg));   //['o']



    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值