javascript - jQuery用toggle()显示隐藏元素的问题
迷茫
迷茫 2017-04-10 16:36:38
[JavaScript讨论组]

先贴css和body

<style>
    #panel { width: 300px; height: 300px; margin-left:40px;}
    .head {border: 1px solid black; background: pink; text-align: center; height: 40px; line-height: 40px; width: 300px;}
    .content { width: 300px; height: 200px; display: none; border:1px solid black;}
</style>
</head>
<body>
     <p id="panel">
         <h5 class="head">什么是jQuery</h5>
         <p class="content">
             jQuery是继Prototype之后有一个优秀的JS库
         </p>
     </p>
</body>

两种JS写法,结果却不一样,第二种写法点击后展开并立刻消失

    $(document).ready(function(){
        $("#panel h5.head").click(function() {
            $(this).next().slideToggle(function() {
                $(this).next().show();
            }, function() {
                $(this).next().hide();
            });
        });
    })
     $(document).ready(function(){
        $contents = $(".content");
        $("#panel h5.head").click(function() {
            $contents.slideToggle(function() {
                $contents.show();
            }, function() {
                $contents.hide();
            });
        });
    })

我就是把第一种写法里面的$(this).next()直接赋给变量$contents,然后替换掉所有的$(this).next(),点击标题显示了后立刻就消失了,正常来说应该是我点击才消失啊。这是为什么?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHPz

#panel h5.head的next就是p.content
我们先不论API是否使用正确
A.

$("#panel h5.head").click(function() {
    $(this).next().slideToggle(function() {
        $(this).next().show();
    }, function() {
        $(this).next().hide();
    });
});

$(this).next()中的this已经不是head元素了,而是.content元素也就是$(this).next().slideToggle中的$(this).next()指向的DOM元素,那么$(this).next()就是什么都没有,是空的,所以$(this).next().hide();没有任何效果的

B. 回调函数的作用是当show/hide动画效果结束后的后续处理

了解了上面的,就好理解

$contents = $(".content");
$("#panel h5.head").click(function() {
    $contents.slideToggle(function() {
        $contents.show();
    }, function() {
        $contents.hide();
    });
});

表现的行为了,显示后再回调中马上又hide拉;
slideToggle干的就是show/hide的活,你再在回调中设置show/hide干嘛呢

再来说说API,jQuery对于slideToggle的接口调用有如下方式
.slideToggle( [duration ] [, complete ] )
.slideToggle( options )
.slideToggle( [duration ] [, easing ] [, complete ] )
似乎没有接受2个回调函数的接口啊
你的代码子所以能够运行时因为
你传入了2个参数,那么使用slideToggle( [duration ] [, complete ] )
duration类型不匹配,使用默认值,你设置的函数被丢弃
第2个函数为slideToggle执行完以后的回调函数

PHP中文网
  1. 因为你slideToggle回调里面的 $(this) --> .content

  2. slideToggle 默认就是干这事的,根本不用你加回调函数

  3. 就算是加回调函数,第一个参数是 duration (Type --> string or number) ,根本不能用function

PHPz

应该是一次点击中slideToggle执行了两次,加断点看看

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号