点击重复执行,这是js冒泡吗,怎么解决,如下图和代码,

如下

问题

刚开始two是隐藏的,点击one对应的two会显示,第一次点击two的时候,只会跳出一个alert(),重复点击就会递增的alrt(), 2次,3次......

图片

https://img2.mukewang.com/5c8f46c800015af405380441.jpg

代码

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .one {
            height: 100px;
            border-bottom: 1px solid #000;
        }
        
        .two {
            display: none;
            width: 50px;
            height: 20px;
            border: 1px solid #ccc;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="box-item">
            <div class="one">
                one
                <div class="two">two</div>
            </div>
        </div>
        <div class="box-item">
            <div class="one">
                one
                <div class="two">two</div>
            </div>
        </div>
        <div class="box-item">
            <div class="one">
                one
                <div class="two">two</div>
            </div>
        </div>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $('.box .box-item .one').click(function() {
            $(this).find(".two").show()
            $(this).find(".two").click(function() {
                alert($(this).html());
            })
        })
    </script>
</body>

</html>
慕丝7291255
浏览 447回答 4
4回答

侃侃尔雅

这不是冒泡,这是重复绑定。 DOM里的事件是这样的,你可以想象每个DOM结构有一张散列表,这张表一开始是空的,每次注册一个事件回调呢,就会把这个回调记到这个表上;而事件发生的时候呢,就会找到这个表,然后一个回调一个回调的去执行。 有个常见的误区,是以为每个DOM只有一个回调,事件发生时被触发执行,这是不对的。事实上,注册了一个回调就会执行一个,而注册了好几个,就会挨个执行。 题目中的错误也挺常见,是一个事件回调里边注册另一个事件回调,这样当外边的回调执行时,就会给里边的DOM上挂一个回调,执行多次以后,里边的回调也相应增多,这样在触发里边DOM的时候,就会有多个回调被执行,从而导致错误。 原生写法的注册事件其实可以拒掉具名函数事件回调的重复注册,但在jQ里,都是匿名函数/函数表达式,原生也防不住,从而变成了常见错误。

动漫人物

$(this).find(".two").click(function(e) { e.stopPropagation(); alert($(this).html()); })

开心每一天1111

$('.box .box-item .one').click(function() { $(this).find(".two").show() $(this).find(".two").off(); $(this).find(".two").click(function() { alert($(this).html()); }) })
打开App,查看更多内容
随时随地看视频慕课网APP