请问老师为什么不会执行

请问老师为什么不会执行

老师不想不通 为什么在点击show后在点击hide事件,不会触发shown事件

这个运行过程是什么样子的。

我的理解是点击显示触发show方法代码会依次执行对吧。虽然off了transitionend但是又会onetransitioned事件,仍然会触发onetransitioned事件。为什么不会执行shown?难道点击之后show之后的代码就停止执行了?

正在回答

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

6回答

同学你好,看得出来你是个特别爱钻研的同学,非常棒!但是同学,我分析了一下你的问题,基本上都是关于底层的代码原理的,这个不太好理解,如果你实在是想不通,那暂时先不要纠结了,可以先把实现的流程记住,先学会怎么用,再研究原理,现在还没有学会怎么用呢,就先研究原理确实是有点难度。我特别理解你的渴望知识的心态,但是要一步一步来,欲速则不达。你可以先把这块的原理放一放,等学习完这块的内容,再来看看老师帮你做的分析,或许很容易就明白了。

加油!如果帮助到了你,欢迎采纳!    

提问者 hy_wang 2018-10-25 21:59:49

请问老师我有了新的理解同时又有了新的疑问,请老师指教
http://img1.sycdn.imooc.com//climg/5bd1cc530001f4f810011001.jpg

  • 建议同学不要想得那么复杂,可以看成是两个单纯的定时器执行,里面有不同的样式,一个定时器执行完毕之后,才能执行另一个定时器。
    2018-10-26 11:30:18
  • 提问者 hy_wang 回复 好帮手慕星星 #2
    不是,请问一下老师是不是说如果点击快了是不是就是会阻塞定时器的执行了,这不就会出现bug了吗
    2018-10-27 19:32:53
好帮手慕星星 2018-10-25 09:58:12

你粘贴的:hover这个列子与视频中的show是不一样的,:hover是一个移入移出的动作,即使在移入的时候动画没有执行完毕,立即移出元素,也会恢复到原来的状态,并不会先执行完移入的动画。

而视频中的show:

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

可以在里面打印几个数字,将定时器的时长增加到500ms,出来的效果就是:

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

所以说明了是hide方法中off()将原来的transitionend事件给解除了,show中的动画是执行完毕的,并没有立即隐藏。

自己可以测试一下。

  • 提问者 hy_wang #1
    请问那是不是说无论我点击隐藏的有多快,show的动画还是会在执行完毕之后才会隐藏。 Hover css中的动画和jquery中的动画实现原理不同是吗
    2018-10-25 21:33:53
  • 提问者 hy_wang #2
    同时请问css中的transition过渡属性是否和jquery一致,加入队列异步等待执行
    2018-10-25 22:02:30
  • 好帮手慕星星 回复 提问者 hy_wang #3
    是的,无论点击隐藏有多快,执行完show之后才会执行hide,是代码设置在定时器中的原因。css中的transition属性并不是异步的,因为:hover伪类就是一个动作,鼠标移入才会触发改变,鼠标移出就恢复原状,并不需要等待过渡执行完毕。
    2018-10-26 09:50:05
提问者 hy_wang 2018-10-24 14:36:37

请问老师我的理解正确吗,虽然不会触发shown但是仍然会完成之前的动画之后再隐藏http://img1.sycdn.imooc.com//climg/5bd012f300016fe510011001.jpg

  • 可以这样理解,是hide事件中的off将之前的transitionend事件给清除了,也就是show中添加的事件,所以没有‘shown’输出。
    2018-10-24 15:10:24
  • 提问者 hy_wang 回复 好帮手慕星星 #2
    请问老师关于我的这个 仍然会完成之前的动画之后再隐藏 这句话对吗?我自己测试了如下代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div{ width: 500px; height: 500px; background: red; transition: all 20s; } div:hover{ width: 0px; } </style> </head> <body> <div id='one'></div> <script type="text/javascript"> console.log(one); var one={ two:'wang hao yu' }; console.log(one.two); // for(var p in one){ // console.log(one[p]); // } </script> </body> </html> 当鼠标移入的时候,他会慢慢变但是我在移入的过程中移出就会从当前状态变回去了而不是执行完一个动画之后才会执行另一个动画。 请问老师关于代码中的show是不是同理,在show的同时立马点击hide是不是不必等show渲染完毕可以终止show到当前过程然后从当前过程开始隐藏?可是我在老师给的代码中并没有看到stop()啊。请给我解释
    2018-10-24 19:09:52
  • 提问者 hy_wang 回复 好帮手慕星星 #3
    就是说关于transition的过渡,他是会在取消过渡的时候元素会停止在当前状态吗
    2018-10-24 19:13:13
好帮手慕星星 2018-10-24 13:50:25

点击事件并不是异步的操作,而transitionend 事件在 CSS 完成过渡后触发,也就是当元素显示出来之后触发并输出‘shown’,代码执行的顺序是:

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

如果点击show按钮之后立即点击hide按钮,那么就会立即执行hide的事件,

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

隐藏元素之后,在show的事件中并没有显示出来元素,所以就没有完成show中的css过渡,没有触发show事件中的transitionend,所以就没有输出'shown'。

祝学习愉快!

  • 提问者 hy_wang #1
    请问点击show触发show难道不用等show执行完毕在执行hide吗? Show执行一半就不执行了??
    2018-10-24 14:25:41
提问者 hy_wang 2018-10-23 20:41:03

老师请问是不是异步的问题,点击事件属于异步操作?当点击时候,主线程应该是在运行setTimeout也就是动画正在淡入,但是此时点击事件,浏览器事件处理会立马异步同时执行事件函数。在shown前异步移除了shown绑定的事件所以就不会触发了吗

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

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

在线咨询

领取优惠

免费试听

领取大纲

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