关于add和stopPropagation()

关于add和stopPropagation()

var index=0;

var swiper = function() {

        $('img').eq(index).css({ 'opacity': '1' }).siblings().css({ 'opacity': '0' });

    };

swiper();

$('a').add(document).on({

click:function(){

event.stopPropagation();

index=$(this).index();

swiper();

},

keydown:function(){

// console.log(event.index);

event.stopPropagation();

if(event.keyCode==37){

index=index==0?$('a').length-1:index-1;

console.log(37);

}

if(event.keyCode==39){

index=index==$('a').length-1?0:index+1;

console.log(39);

}

swiper();

}

})

$('a').add(document).on(click....keyup.....)这样写之后相当于a绑定了两个事件,一个是click,一个是keyup,keyup事件只能作用在input上或者是document上所以这里的a仅click事件生效。

document,除了绑定了keyup事件还被绑定了click事件,keyup事件正常响应,但click事件时候,index=$(docuemt).index()值为-1,在$('a).eq(-1)时,等价于选择最后一张,所以会展示最后一张图片

关于stopPropagation(),因为键盘事件对a标签无效,所以主要是针对click的,在点击a标签的时候会触发a和document的click事件,加上之后就可以值触发a的click事件。不然会冒泡,先执行a的click事件再执行document的click事件,而document的click事件会一直显示最后一张图。

但点击非a标签的document区域,一直跳转最后一张图啊

老师帮我看看上面理解对不对,有点绕,但我尽力了,十分感谢

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,理解有误差的地方,解答如下:

1、这种写法是相当于绑定了两个事件,一个是click,一个是keydown,a元素也会触发keydown事件,如下:选中a之后,按下键盘后,会触发keydown事件

http://img1.sycdn.imooc.com//climg/5ea2811c097f5f0017480446.jpg

http://img1.sycdn.imooc.com//climg/5ea27fb509c00afc05260256.jpg

所以说keydown事件中也需要使用stopPropagation方法阻止事件冒泡。

http://img1.sycdn.imooc.com//climg/5ea2812e09ae3e0412940596.jpg

2、点击非a标签的document区域,此时的$(this)指向document,导致无法获取到对应的index,所以去跳转到最后一张。可以打印下查看输出结果

http://img1.sycdn.imooc.com//climg/5ea2825d09478ab308940436.jpg

结果如下:

http://img1.sycdn.imooc.com//climg/5ea2827009f25c4808380194.jpg

建议:添加一个判断,当前点击的是a标签时,再设置index值,调用swiper方法。

http://img1.sycdn.imooc.com//climg/5ea2830d0970abea08480398.jpg

同学先了解下即可,老师在后面的课程中会有详细的讲解,同学可以继续往后听课。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 王文辉 提问者 #1
    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> div{ width: 300px; height: 300px; } #div1{ background-color: red; } #div2{ background-color: #93B3C6; } </style> </head> <body> <div id="div1"> <input type="" name="" id="" value="" /> </div> <div id="div2"> <a href="#">123</a> <!-- <img src="img/1.jpg" style="display: block;" > --> </div> </body> <script src="js/jquery1.8.3.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $("#div1,#div2").keypress(function(){ console.log('1') }) $("#div2>a").keypress(function(){ console.log('1') }) </script> </html> 上一个demo我试了下,a标签可以触发keypress事件,但我重新写了一个测试demo,a无法触发,为什么啊
    2020-04-25 15:25:33
好帮手慕慕子 2020-04-25 17:22:46

同学你好,老师测试同学的代码,选中a之后,可以正常触发keypress事件。为了方便看到结果,修改下触发a的keypress事件中输出内容

http://img1.sycdn.imooc.com//climg/5ea4008709339b2410320444.jpg

测试结果:

http://img1.sycdn.imooc.com//climg/5ea401570a64f9f701410337.jpg

同学可以再测试下,祝学习愉快~

  • 提问者 王文辉 #1
    我试了下,是的,必须点击之后的a,或者是点这不放开可以触发,但悬浮状态,就是hover状态是无法触发的?对吗
    2020-04-25 17:56:07
  • 好帮手慕慕子 回复 提问者 王文辉 #2
    同学你好,是的,a元素hover状态下无法触发,祝学习愉快~
    2020-04-25 19:05:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师