我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于js中e.preventDefault()的具体使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于js中e.preventDefault()的具体使用

背景:

同事在项目中遇到的问题,在项目中导入了某一个组件作为根组件之后,发现原来的子组件中的滚动效果不再生效,因为是移动端的项目,所以这里的滚动效果是通过touchmove事件进行触发的,在对引入的组件进行研究后,发现是在根组件中阻止了touchmove事件的默认事件,也就是调用了e.preventDefault()方法,然后同事们通过阻止冒泡阻止了这个方法的调用,解决掉了因为引入组件而带来的问题,但这却引发了一连串的有关于preventDefault()这个方法的思考。

问题:

为什么我在父组件上使用preventDefault(),阻止默认事件会导致我的子组件的默认事件失效?

分析:

首先,我们看官网对event.preventDefault()这一方法的解释,在繁体中文版的MDN网站中,只是简单的提到了取消事件的预设行为,而不影响事件的传递。如字面意思,很好理解。

而在简体中文版的MDN网站中,对于此事件描述的文字对比繁体版较多

在这里提到一个词,叫显示处理,不是很能理解这个词。繁体版与简体版的比较对应下来,也能够说的过去,所以这里并不能解决我们的疑问,到底为什么在父元素上调用了这个方法阻止默认事件,子元素的默认事件也消失了?

持续跟进:

翻遍了百度,我没有找到有关于这个问题的解答,莫得办法了,只有自己去试着找一些结论性的东西。

尝试:

<!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{
            height: 300px;
            overflow: auto;
            width:200px;
            padding: 40px;
            margin: 0 auto;
            background: grey;
        }
        #gdfather{
            position: relative;
            height: 600px;
            overflow: auto;
            width:400px;
            margin: 40px;
            background: rgba(0, 255, 255, 0.219);
        }
        #father{
            position: absolute;
            top: 20px;
            height: 200px;
            overflow: auto;
            width: 600px;
            margin: 40px;
            background-color: rgba(128, 128, 128, 0.349);
        }
        #son{
            position: absolute;
            top: 20px;
            height: 1400px;
            width: 800px;
            margin: 40px;
            background-color: rgba(205, 92, 92, 0.26);
        }
        #box2{
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
            height:200px;
            width: 200px;
            background-color: khaki;
        }
    </style>
</head>
<body>
    <div id='box'>
        <div id='gdfather'>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <p>祖先中的内容</p>
            <div id='father'>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <p>父亲中的内容</p>
                <div id='son'>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                    <p>儿子中的内容</p>
                </div>
            </div>
        </div>
    </div>
    <div id='box2'>
        <input id="ipt" type="text">
        <div id='inbox'>
            <input id='inIpt' type="text">
        </div>
    </div>
    <script>
        let gdfather=document.getElementById('gdfather')
        let father=document.getElementById('father')
        let son=document.getElementById('son')
        gdfather.addEventListener('touchmove',(e)=>{
            // console.log('gdfather')
            // e.preventDefault()
        })
        father.addEventListener('touchmove',(e)=>{
            // console.log('father')
            console.log(e.preventDefault.toString())
            console.log(e)
        })
        let box2=document.getElementById('box2')
        let inbox=document.getElementById('inbox')
        let ipt=document.getElementById('ipt')
        let inIpt=document.getElementById('inIpt')
        let events
        box2.addEventListener('keydown',(e)=>{
            // e.preventDefault()
            console.log(e===events)
        })
        ipt.addEventListener('keydown', (e)=>{
            console.log(e===events)
            console.log(JSON.stringify(e)===JSON.stringify(events))
            events=e
        })

        inIpt.addEventListener('keydown', (e)=>{
            // e.preventDefault()
            events.preventDefault()
            console.log(events)
        })
    </script>
</body>
</html>

总结

元素并不拥有事件,实际上,元素只是对事件进行了一个监听。就比如一个人进行一场马拉松比赛,这个人进行比赛的这个过程,就是事件从诞生到结束的整个过程。而在比赛的途中,我们设置了一些里程点,每一场马拉松比赛都会在里程点设置对应的补给,我们规定每到达一个补给点就会进行补给,这个可以看作事件的默认行为。当事件每到达一个里程点时,我们可以在这个里程点做一些事,比如欢呼之类的(也就是设置事件监听),也可以啥都不做。这个里程点就是元素,而欢呼就是元素在监听到这个事件时我们设置的行为。

实际上,即使是同一个事件,所拥有的event也是不同的,这个在上面的118和119行可以进行证明,而同一类型的事件在触发时只会拥有这一个event,这一点通过118和115可以证明,对应到马拉松就是每一次马拉松都是不同的,而一条路线上只可能进行一场马拉松比赛。当我们阻止事件冒泡时,相当于我们在跑到23公里时,放弃了这场比赛,那么在32公里处等着为我们欢呼的人就永远不会触发这个动作。而我们在使用event.preventDefault()这个方法时,相当于我们撤掉了所有的里程点的补给,自然也就没有了默认行为,但我们还在跑,原来在32公里处为我们欢呼的人依旧会为我们欢呼。

在通过上面的分析后,已经可以很好的理解为什么在父组件中使用了preventDefault(),而子组件也没有默认行为了,因为所有的补给都被撤掉了。即在这一条线上所有的默认行为都没有了。

e.preventDefault()与return false的区别

事件处理函数的返回值(return false)只对通过属性注册的处理函数才有意义;
也就是说如果我们不是通过addEventListener()函数来绑定事件的话,那么要禁止默认事件的话,用的就是return false;

如果使用addEventListener()或者attachEvent()函数来绑定的话,就要使用e.preventDefault()方法或者设置事件对象的returnValue属性来阻止默认事件。

到此这篇关于关于js中e.preventDefault()的具体使用的文章就介绍到这了,更多相关js e.preventDefault()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于js中e.preventDefault()的具体使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于js中e.preventDefault()的具体使用

本文主要介绍了关于js中e.preventDefault()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

js中关于promise怎么使用

这篇文章主要介绍“js中关于promise怎么使用”,在日常操作中,相信很多人在js中关于promise怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中关于promise怎么使用”的疑惑有所帮助!
2023-07-05

js中document.getElementById(id)的具体用法

本文主要介绍了js中document.getElementById(id)的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

关于MySQL中explain工具的使用

目录输出结果详解:EXPLAIN 是 mysql 提供的一种工具,用于分析查询语句的执行计划,即查询优化器是如何决定执行查询语句的。EXPLAIN可以帮助我们分析查询语句的性能瓶颈,找php出问题所在,进而优化查询语句和数据库结构。使用E
2023-05-06

C#中static关键字的具体使用

C#中static关键字声明静态成员,与类相关,不依赖于对象实例。包括静态字段(共享数据)、静态方法(类级功能)和静态类(不能创建实例)。静态成员共享性强,类级访问,线程安全,持久存在。优点是共享数据、提供工具方法、提高效率;缺点是可测试性差、可扩展性受限、可重用性低。最佳实践是仅在必需时使用,优先使用实例成员,依赖注入管理依赖关系,慎用静态类。
C#中static关键字的具体使用
2024-04-02

vue中关于@media媒体查询的使用

这篇文章主要介绍了vue中关于@media媒体查询的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

关于生产消费者模型中task_done()的具体作用

这篇文章主要介绍了关于生产消费者模型中task_done()的具体作用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-25

js中关于promise的用法解读

这篇文章主要介绍了js中关于promise的用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-06

js实现前端跨域postMessage的具体使用

这篇文章主要介绍了js实现前端跨域postMessage的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

工具类之关于RestTemplateUtil工具类的使用

这篇文章主要介绍了工具类之关于RestTemplateUtil工具类的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Python中collections.Counter()的具体使用

目录Counter类创建计数值的访问与缺失的键计数器的更新键的删除elements()most_common([n])fromkeys浅拷贝copy算术和集合操作常用操作Counter类Counter类的目的是用来跟踪值出现的次数。它是一个
2022-06-02

python中pywifi的具体使用

本文主要介绍了python中pywifi的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06

java中Thread.sleep()的具体使用

本文主要介绍了 java中Thread.sleep()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

编程热搜

目录