【问题标题】:call a function after another has finished in JS在 JS 中完成另一个函数后调用一个函数
【发布时间】:2015-01-21 16:12:45
【问题描述】:

我有一个菜单,当我点击一个 btn 时它会滑出,这很好,但现在我想按其他任何地方来隐藏菜单,而不仅仅是按同一个 btn。

// menu
$('.toggle').click(function(event) {
	event.preventDefault();
	$('.self').toggleClass('show-m');
	$('.toggle').toggleClass('show-t');
	$('.content').toggleClass('move-co');
});


/*
$('#s-form').submit(function(event) {
	if (!$('#search').val()) {
		event.preventDefault();
	} else {
		$.pjax.submit(event, '#result');
	}
});
*/
*{
  outline: none !important;
  box-sizing: border-box;
  transition: all 0.3s ease-in-out;
}
li {
    list-style: none;
}
.content{
  padding: 100px 0;
}
/* menu */
/* toggle */
.menu .toggle {
    padding: 10px;
    position: fixed;
    top: 20px;
    left: 0;
    z-index: 10;
    background: #111;
    color: #fff;
    border: none;
}
.show-t {
    transform: translate(300px,0);
}
/* menu self */
.menu .self {
    width: 300px;
    padding: 15px;
    position: fixed;
    top: 0;
    bottom: 0;
    left: -310px;
    z-index: 20;
    text-align: center;
    background: white;
    box-shadow: 2px 0 10px 0 rgba(0,0,0,0.5);
}
.show-m {
    left: 0 !important;
}
.menu .self ul {
    padding: 0;
}
.menu .self ul li {
    padding: 10px 0;
    margin: 10px 0;
    text-align: center;
    background: #ecf0f1;
}
.menu .self li a {
    width: 100%;
    display: inline-block;
    color: #95a5a6;
}
.move-co {
    transform: translate(250px,0);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="menu">
  <button type="button" class="toggle">Menu</button>
  <nav class="self">
    <ul>
      <li>item 1</li>
	  <li>item 2</li>
	  <li>item 3</li>
	</ul>
  </nav>
</div>

<section class="content">
 	  <p>
         Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab, ex, nihil! Recusandae porro sit            facere architecto, optio id quis odio qui similique reiciendis dolor, saepe assumenda placeat            voluptatem iusto sunt!
      </p>
 </section>

编辑:

对于那些投反对票并竞选的人,有一个神奇的按钮调用add a comment,你可以用它来表达一个解决方案:)。

【问题讨论】:

  • @RoryMcCrossan 是的,它在 css 中,那么如何在第一个函数完成后才运行第二个函数?
  • 您可以挂钩到transitioned 事件。但是,我没有看到在彼此之上添加更多点击处理程序的意义。你到底想达到什么目的?
  • @RoryMcCrossan 正如我已经说过的,我想点击其他任何地方来隐藏菜单,而不仅仅是.toggle btn

标签: jquery menu show-hide


【解决方案1】:

在body上绑定一个事件,然后根据目标做一些动作:

// menu
$(document).click(function(event) {
    var $target = $(event.target),
        $target_is_menu = !!$target.closest('.menu').length,
        $target_is_button = !!$target.closest('.toggle').length,
        action = $target_is_button ? 'toggleClass' : 'removeClass';
  
    if($target_is_menu && !$target_is_button) return;

    if($target_is_button) event.preventDefault();
  
    $('.self')[action]('show-m');
    $('.toggle')[action]('show-t');
    $('.content')[action]('move-co');
});
*{
  outline: none !important;
  box-sizing: border-box;
  transition: all 0.3s ease-in-out;
}
li {
    list-style: none;
}
.content{
  padding: 100px 0;
}
/* menu */
/* toggle */
.menu .toggle {
    padding: 10px;
    position: fixed;
    top: 20px;
    left: 0;
    z-index: 10;
    background: #111;
    color: #fff;
    border: none;
}
.show-t {
    transform: translate(300px,0);
}
/* menu self */
.menu .self {
    width: 300px;
    padding: 15px;
    position: fixed;
    top: 0;
    bottom: 0;
    left: -310px;
    z-index: 20;
    text-align: center;
    background: white;
    box-shadow: 2px 0 10px 0 rgba(0,0,0,0.5);
}
.show-m {
    left: 0 !important;
}
.menu .self ul {
    padding: 0;
}
.menu .self ul li {
    padding: 10px 0;
    margin: 10px 0;
    text-align: center;
    background: #ecf0f1;
}
.menu .self li a {
    width: 100%;
    display: inline-block;
    color: #95a5a6;
}
.move-co {
    transform: translate(250px,0);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="menu">
  <button type="button" class="toggle">Menu</button>
  <nav class="self">
    <ul>
      <li>item 1</li>
	  <li>item 2</li>
	  <li>item 3</li>
	</ul>
  </nav>
</div>

<section class="content">
 	  <p>
         Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab, ex, nihil! Recusandae porro sit            facere architecto, optio id quis odio qui similique reiciendis dolor, saepe assumenda placeat            voluptatem iusto sunt!
      </p>
 </section>

【讨论】:

  • 不幸的是什么也没做。
  • @ctf0 你能用 jsFiddle 解决你的问题吗?这会很有帮助!
  • 嘿,Karl,它按预期工作,但现在的问题是,如果您单击侧边栏中的任何位置,它会关闭它,有解决办法吗?
  • thanx 但我在那个菜单中有一个搜索输入,现在我无法提交,因为上面的函数忽略了它,请再次检查主帖子,我添加搜索代码。
  • @ctf0 嗯,我在代码中打错了字,“return”写错了(它是reutrn)。除此之外,我唯一能想到的就是preventDefault() 搞乱了提交。尝试在 var 声明后插入if($target_is_button) event.preventDefault();,然后删除函数的第一行。
【解决方案2】:

你不能使用 jQuery .hover 事件吗? http://api.jquery.com/hover/

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多