20掌握JavaScript事件绑定:从入门到跨浏览器兼容的实战秘籍

目录

常见事件

绑定事件的第一种方式

使用addEventListener绑定事件

使用attachEvent绑定事件

【兼容性封装】addEventListener和attachEvent


非 VIP 用户可前往公众号“前端基地”进行免费阅读,文章链接如下:

20掌握JavaScript事件绑定:从入门到跨浏览器兼容的实战秘籍

常见事件


        在JavaScript中,事件是实现页面交互的关键,通过监听不同事件并执行相应代码,可实现丰富的功能。常见事件如下:

        鼠标事件:

事件名

描述

onclick

鼠标单击元素时触发,常用于按钮点击操作等场景,如提交表单、触发功能按钮等。

ondblclick

鼠标双击元素时触发,可用于实现双击放大图片、快速打开文件等操作。

onmouseover

鼠标指针移动到元素上方时触发,常配合onmouseout实现鼠标悬停效果,如导航菜单的展开与收起。

onmouseout

鼠标指针移出元素范围时触发。

onmouseenter

鼠标指针进入元素时触发,与onmouseover功能类似,但onmouseenter不会在子元素上重复触发,适合处理复杂结构元素的鼠标进入效果 。

onmouseleave

鼠标指针离开元素时触发,与onmouseenter对应,同样不会在子元素上重复触发。

onmouseup

鼠标按键在元素上被松开时触发,常与onmousedown配合,实现完整的鼠标操作流程,如完成拖拽动作。

onmousedown

鼠标按键在元素上被按下时触发,常用于模拟按下按钮的初始状态,如在拖拽功能中记录鼠标按下的起始位置。

onmousemove

鼠标在元素上移动时持续触发,可用于实现鼠标跟随效果、放大镜效果等。

        键盘事件

事件名

描述

onkeyup

按下键盘上的一个键并释放时触发,可用于实时监听用户输入,如搜索框的实时搜索功能。

onkeydown

按下键盘上的键时触发(在onkeyup之前),可用于拦截特定按键操作,如禁止用户输入某些字符。

onkeypress

按下可打印字符键时触发(不包括功能键,如 Ctrl、Shift 等),主要用于处理文本输入相关操作。

        表单事件

事件名

描述

onchange

适用于文本框、下拉菜单等表单元素,当元素的内容或选项发生改变且失去焦点时触发,常用于表单数据的验证和提交前的处理 。

onfocus

元素获得焦点时触发,如文本框获取鼠标光标,可用于显示提示信息或改变文本框样式。

onblur

元素失去焦点时触发,常与onfocus配合进行表单验证,如检查输入内容是否符合要求。

onsubmit

表单提交时触发,可用于在提交前进行数据合法性校验,阻止不符合要求的表单提交。

onreset

表单提交时触发,可用于在提交前进行数据合法性校验,阻止不符合要求的表单提交。

        页面与元素事件

事件名

描述

onload

整个网页文档、图片等资源加载完成后触发,常用于初始化页面数据、执行依赖资源加载完成后的脚本。

onunload

用户离开当前页面(如关闭窗口、跳转页面)时触发,可用于保存用户的临时数据或执行清理操作。

onscroll

当元素的滚动条发生滚动时触发,常用于实现滚动加载、回到顶部按钮显示隐藏等功能。

onresize

浏览器窗口或框架大小被调整时触发,可用于实现响应式布局,根据窗口大小动态调整页面样式和内容。

绑定事件的第一种方式


        在JavaScript里,可借助“元素对象.on事件类型”这种语法形式来绑定事件。具体语法如下:

元素对象.onclick=function(){
    //这里编写触发事件后要执行的代码
}

        需要留意的是,运用“元素对象.on事件类型”这种方式绑定事件时,由于它本质是赋值操作,所以后写的事件处理函数会覆盖先写的。

        示例代码如下:

<body>
    <button>按钮</button>
    <script>
        var btn=document.getElementById('btn');
        btn.onclick=function(){
            console.log('第一次绑定onclick事件');
        }
        btn.onclick=function(){
            console.log('第二次绑定onclick事件');//会覆盖第一次的绑定
        }
        btn.onmouseover=function(){
            console.log('第一次绑定onmouseover事件')
        }
        btn.onmouseover=function(){
            console.log('第二次绑定onmouseover事件')//会覆盖第一次的绑定
        }
    </script>
</body>

        运行结果:当你点击按钮时,控制台会输出 第二次绑定 onclick 事件;当鼠标悬停在按钮上时,控制台会输出 第二次绑定 onmouseover 事件。这就表明后绑定的事件处理函数覆盖了先绑定的。

使用addEventListener绑定事件


        addEventListener 是现代浏览器(包括 IE9+)标准的事件绑定方法,具有更高的灵活性和功能性。其语法如下:

元素对象.addEventListener=('不带on的事件类型',事件处理函数,[useCapture])

        事件类型:指定事件名称(如 click、mouseover),不带 on 前缀

        事件处理函数:事件触发时执行的回调函数

        useCapture(可选):布尔值,指定事件在捕获阶段(true)或冒泡阶段(false)触发,默认值为 false

        示例代码如下:

<body>
    <button>按钮</button>
    <script>
        var btn=document.getElementById('btn');
        console.log(btn.addEventListener);
        btn.addEventListener('click',fn1,false);
        btn.addEventListener('click',fn2,false);
        btn.addEventListener('click',function(){
            console.log('我是匿名函数');
        },false);
        function fn1(){
            console.log('我是fn1函数');
        }
        function fn2(){
            console.log('我是fn2函数');
        }
    </script>
</body>

        分析:

        ie6、7、8版本浏览器:

console.log(obj.addEventListener); //undefined

        在 IE9 及以上版本浏览器和主流浏览器中,addEventListener不仅完全可用,还支持为同一元素多次绑定相同类型事件,其事件处理函数会按绑定顺序依次执行,同时还能通过参数灵活控制事件在捕获或冒泡阶段触发,实现更精细的事件流管理。

        运行结果:

使用attachEvent绑定事件


        attachEvent 是微软为 IE 浏览器(IE5.5-IE10)提供的事件绑定方法,现代浏览器已不再支持。其语法如下:

元素对象.attachEvent=('带on的事件类型',事件处理函数)

        事件类型:需带 on 前缀(如 onclick、onmouseover)

        同一元素绑定多个相同类型事件时:

        IE9/10:按绑定顺序从上至下执行

        IE6/7/8:按绑定顺序从下至上执行(与现代浏览器相反)

        兼容性:

        IE10 及以下版本:支持 attachEvent

        IE11+ 和主流浏览器:不支持该方法,需使用 addEventListener

        示例代码如下:

<body>
    <button>按钮</button>
    <script>
        var btn=document.getElementById('btn');
        btn.attachEvent('onclick',fn1);
        btn.attachEvent('onclick',fn2);
        btn.attachEvent('onclick',function(){
            console.log('我是匿名函数');
        });
        function fn1(){
            console.log('我是fn1函数');
        }
        function fn2(){
            console.log('我是fn2函数');
        }
    </script>
</body>

        运行结果:

        IE9/10:

我是fn1函数

我是fn2函数

我是匿名函数

        IE6/7/8:

我是匿名函数

我是fn2函数

我是fn1函数

        IE11+ 或主流浏览器:

btn.attachEvent is not a function

【兼容性封装】addEventListener和attachEvent


     在处理跨浏览器事件绑定时,我们可以创建一个封装函数来兼容现代浏览器的 addEventListener 和旧版 IE 的 attachEvent。

        示例代码如下:

<body>
    <button>按钮</button>
    <script>
        var btn=document.getElementById('btn');
        function addEvent(obj,type,fn,bool){
            if(obj.addEventListener){
                obj.addEventListener(type,fn,bool);
            }else{
                obj.attachEvent('on'+type,fn);
            }
        }
        addEvent(btn,'click',function(){
            console.log('匿名函数');
        },false);
    </script>
</body>

        运行结果:单击按钮,控制台输出:匿名函数

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容