关于事件代理的小问题

来源:2-3 为搜索框添加功能--事件代理和显示隐藏下拉层

键盘f11

2020-10-27 16:05:04

http://img.mukewang.com/climg/5f97c9b309cea2e508380289.jpg

http://img.mukewang.com/climg/5f97c9b3099cc74908850379.jpg

# 具体遇到的问题

 $layer.on('click','search-layer-item',function(){

    $input.val($(this).html());

    $input.parents('form').submit();

    })

老师,我想咨询一下上述代码,如视频中所说的,如果对于每个搜索后的提示内容进行事件绑定,会影响内存,和网页的运行速度(假设绑定的事件有数千个或者是数万个),

所以使用到了事件代理,那么为什么事件代理的层级顺序是往上代理的呢?(问题是往上代理的话,父类没有要代理的事件呀?我们需要代理的不就是search-layer-item?就是说点击li标签的时候,触发事件,是由li往上的父类去触发的?是否可以理解,父类就是指search-layer 就是li的父类标签ul呢?)

 <div id="header-search" class="search fl">

                <form action="https://s.taobao.com/search" class="search-form">

                    <input type="text" name="q" placeholder="灵魂没事一元抢" autocomplete="off" class="search-inputbox fl" />

                    <input type="submit" value="搜索" class="search-btn btn fl" />

                </form>

                <ul class="search-layer">

                    <li class="search-layer-item text-ellipsis">111</li>

                    <li class="search-layer-item text-ellipsis">111</li>

                    <li class="search-layer-item text-ellipsis">111</li>

                </ul>

            </div>

如上述代码所示,当点击onclick事件触发以后,代理的是search-layer-item往上的父类事件,那这样子的事件代理我感觉和事件绑定有什么区别呢?是否可以理解事件绑定的是逐个的li标签下的onclick事件,而事件代理绑定的是li往上的父类,是单个的类,整个类里面触发的事件,比逐个的li标签是少的,从数目上。


$input.val($(this).html());中的this指代的是search-layer-item,也就是搜索以后,显示的每个li标签里面的内容,那这个val()是什么意思呢?老师 ,$input.val($(this).html());这句话是否是指,onclick点击以后使得li标签里面的内容为空呢?html为空?


# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

写回答

1回答

好帮手慕鹤

2020-10-27

同学你好,针对问题进行回复:

1、事件代理,是利用的事件冒泡机制,事件冒泡是从当前元素,往上级元素传播的,所以要将事件代理到父级元素上。

2、 我们实际上想要监听的是search-layer-item的点击事件,由于search-layer-item有很多,考虑浏览器的性能问题,我们可以利用事件代理,将事件绑定在search-layer-item的父元素search-layer上,即如下代码就是给search-layer绑定click事件:

http://img.mukewang.com/climg/5f97e32509906e7304890145.jpg

3、因此,如下理解是正确的:

http://img.mukewang.com/climg/5f97e35509d666e307860197.jpg

4、事件代理其实也是事件绑定,只是,它是将事件绑定在了父元素上,而不是直接绑定在触发事件的元素上。

5、如下理解正确:

http://img.mukewang.com/climg/5f97e38a0920fc5307740119.jpg

6、$input.val($(this).html());中的this指代的是当前触发事件的li标签(search-layer-item);

7、这段代码中的val() 是用来获取被选元素的值。

8、$input.val($(this).html());这段代码的意思是:获取当前触发的li的内容,让获取的内容在input中显示。

可以参考如下代码:

http://img.mukewang.com/climg/5f97e555091a016706700387.jpg

效果:

http://img.mukewang.com/climg/5f97e57c0963aa8805000137.jpg

完整代码:

<!DOCTYPE html>
<html>

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

<body>
    <ul>
        <li class="lis">我是内容1</li>
        <li class="lis">我是内容2</li>
        <li class="lis">我是内容3</li>
    </ul>
    <input type="text">
</body>
<script src="jquery.js"></script>
<script>
var $input = $('input');
$('ul').on('click', ".lis", function() {
    $input.val($(this).html());
})
</script>

</html>

祝学习愉快!

0

0 学习 · 14456 问题

查看课程