为什么定义一个变量来储存获取到的transitionend后 不能触发shown或者hidden事件

为什么定义一个变量来储存获取到的transitionend后 不能触发shown或者hidden事件

<!DOCTYPE html>

<html lang="en">


<head>

    <meta charset="UTF-8">

    <title>显示隐藏模块</title>

    <style>

        body {

            width: 400px;

            margin: 0 auto;

        }


        .btn {

            width: 50%;

            height: 30px;

        }


        #box {

            width: 400px;

            height: 100%;

            background-color: red;

            display: none;

            overflow:hidden;

        }


        .transition {

            -o-transition: all 1s;

            -ms-transition: all 1s;

            -moz-transition: all 1s;

            -webkit-transition: all 1s;

            transition: all 1s;

        }


        .fadeout {

            visibility: hidden;

            opacity: 0;

        }

        

        .slideUpDownCollapse{

            height:0 !important;

        }


        .slideLeftRightCollapse{

            width:0 !important;

        }

    </style>

</head>


<body>

    <button id="btn-show" class="btn">显示</button><button id="btn-hide" class="btn">隐藏</button>

    <div id="box" class="">

        <p>222</p>

        <p>222</p>

        <p>222</p>

    </div>

    <button class="btn">显示2</button>

    <script src="../jquery-3.4.1.min.js"></script>

    <script src="./js/transition.js"></script>


    <script>

        var transition = window.mt.transition.end;


        function init($elem, hiddenCallback) {

            if ($elem.is(':hidden')) {

                $elem.data('status', 'hidden')

                if (typeof hiddenCallback == 'function') hiddenCallback();

            } else {

                $elem.data('status', 'shown')

            }

        }


        function show($elem, callback) {

            if ($elem.data('status') === 'show') return;

            if ($elem.data('status') === 'shown') return;


            $elem.data('status', 'show').trigger('show');

            callback();

        }


        function hide($elem, callback) {

            if ($elem.data('status') === 'hide') return;

            if ($elem.data('status') === 'hidden') return;


            $elem.data('status', 'hide').trigger('hide');

            callback();

        }


        var $box = $('#box');


        var silent = {

            init: init,


            show: function ($elem) {

                show($elem, function () {

                    $elem.show();

                    $elem.data('status', 'shown').trigger('shown')

                })

            },


            hide: function ($elem) {

                hide($elem, function () {

                    $elem.hide();

                    $elem.data('status', 'hidden').trigger('hidden');

                })

            }

        }


        var css3 = {


            fade: {

                init: function ($elem) {

                    css3._init($elem,'fadeout')

                },

                show: function ($elem) {

                    css3._show($elem,'fadeout')

                },

                hide: function ($elem) {

                    css3._hide($elem,'fadeout')

            }

        },

            

            slideUpDown:{

                init: function ($elem) {

                    $elem.height($elem.height());

                    css3._init($elem,'slideUpDownCollapse')

                    },

                show: function ($elem) {

                    css3._show($elem,'slideUpDownCollapse')

                },

                hide: function ($elem) {

                    css3._hide($elem,'slideUpDownCollapse')

                }

        },


            slideLeftRight:{

                init:function($elem){

                    $elem.width($elem.width());

                    css3._init($elem,'fadeout slideLeftRightCollapse')

                },

                show:function($elem){

                    css3._show($elem,'fadeout slideLeftRightCollapse')

                },

                hide:function($elem){

                    css3._hide($elem,'fadeout slideLeftRightCollapse')

                }

            },

            

            fadeslideUpDown:{

                init:function($elem){

                    $elem.height($elem.height());

                    css3._init($elem,'fadeout slideUpDownCollapse');

                },

                show:function($elem){

                    css3._show($elem,'fadeout slideUpDownCollapse');

                },

                hide:function($elem){

                    css3._hide($elem,'fadeout slideUpDownCollapse')

                }

            },


            fadeslideLeftRight:{

                init:function($elem){

                $elem.width($elem.width());

                css3._init($elem,'fadeout slideLeftRightCollapse');

                },


                show:function($elem){

                    css3l._show($elem,'fadeout slideLeftRightCollapse');

                },


                hide:function($elem){

                    css3._hide($elem,'fadeout slideLeftRightCollapse');

                }

            }

    }



    css3._init = function($elem,classname){

        $elem.addClass('transition');

            init($elem, function () {

                $elem.addClass(classname)

                })

    }


    css3._show = function($elem,classname){

        show($elem, function () {

            $elem.off('webkitTransitionEnd').one('webkitTransitionEnd', function () {

                $elem.data('status', 'shown').trigger('shown');

            })

            $elem.show();

            setTimeout(function () {

                $elem.removeClass(classname);

            },200)

        })

    }


    css3._hide = function($elem,classname){

        hide($elem, function () {

            $elem.off('webkitTransitionEnd').one('webkitTransitionEnd', function () {

                $elem.hide();

                $elem.data('status', 'hidden').trigger('hidden');

            })

            $elem.addClass(classname);

        })

    }


    var js = {

        fade:{

            init:function($elem){


            },


            show:function($elem){

                show($elem,function(){

                    $elem.fadeIn();

                    $elem.data('status', 'shown').trigger('shown');

                })

            },

            

            hide:function($elem){

                hide($elem,function(){

                    $elem.fadeOut();

                    $elem.data('status','hidden').trigger('hidden');

                })

            }

        }

    }

        css3.fade.init($box);

        $('#btn-show').on('click', function () {


            css3.fade.show($box);


        })


        $('#btn-hide').on('click', function () {


            css3.fade.hide($box);


        })


        $box.on('show shown hide hidden', function (e) {

            if (e.type == "show") {

                console.log('触发show')

            } else if (e.type == "shown") {

                console.log('触发shown')

            } else if (e.type == 'hide') {

                console.log('触发hide')

            } else if (e.type == 'hidden') {

                console.log('触发hidden')

            }

        })


    </script>

</body>


</html>



正在回答

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

2回答

同学你好,如下,是这样替换的吗?

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

这是因为transition是个变量,不需要添加引号,去掉即可,例:

http://img1.sycdn.imooc.com//climg/5dd3d074091b310309940148.jpghttp://img1.sycdn.imooc.com//climg/5dd3d097093eeeba02150125.jpg

另,建议:同学以后提问这样的问题的时候,可以详细的描述下那块进行了替换,也可以提供替换的代码,像如下这样,标注好哪里进行了替换。便于更加准确的定位与解决问题。

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

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

  • lcyjerry 提问者 #1
    为什么我添加了引号后才能出发shown和hidden事件
    2019-11-20 16:26:05
  • lcyjerry 提问者 #2
    添加引号和不添加都能出发shown hidden事件
    2019-11-20 16:29:44
  • lcyjerry 提问者 #3
    不对,老师,还是不行啊,添加了引号和不添加引号都不能触发shown hidden 事件
    2019-11-20 16:33:20
好帮手慕糖 2019-11-19 17:53:28

同学你好,因为存放的位置不同,老师这里transition.js引入的位置是有调整的。但是事件是可以触发的,如下。

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

同学的不能触发是有提示什么错误吗?或者可以详细描述下是如何操作的。

祝学习愉快!

  • 提问者 lcyjerry #1
    我用了transition替换了webkitTransitionEnd就无法触发hidden事件
    2019-11-19 18:57:36
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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