【问题标题】:jQuery Clean UpjQuery 清理
【发布时间】:2017-08-21 17:19:00
【问题描述】:

总的来说,我对 jQuery 和 JavaScript 还很陌生。

我为一个简单的推送菜单编写了这段代码,但我觉得可能有更好的方法来编写它,因为其中一些似乎重复了。

任何建议都会很棒。

完整代码可见here

//Mobile Push menu

// Open or close menu using menu bar icon or clicking outside of the menu
$('.menu-icon').click(function() {
    $('.main-content').toggleClass('push-open push-close');  
    $('.menu-icon').toggleClass('push-open push-close');
});

// Close menu with X icon
$('.close-icon').click(function() {
  $('.main-content').toggleClass('push-open push-close'); 
  $('.menu-icon').toggleClass('push-open push-close');
});

//Close menu on link click
$('.menu a').click(function() {
  $('.main-content').toggleClass('push-open push-close'); 
  $('.menu-icon').toggleClass('push-open push-close');
});

// Close with esc key
$(document).keyup(function(e) {
  if (e.keyCode == 27) { // escape key maps to keycode `27`
    if( $('.main-content').hasClass('push-open') ){
      $('.main-content').addClass('push-close');
      $('.main-content').removeClass('push-open');
    }
    if( $('.menu-icon').hasClass('push-open') ){
      $('.menu-icon').removeClass('push-open');         
      $('.menu-icon').removeClass('push-close');
    }
  }
});

【问题讨论】:

  • 为什么不上一堂普通课呢?这样你只需要一个$('.menu_class').click(function() { $('.closing_class').toggleClass('push-open push-close'); });
  • @JamesJohnston & Heck - 你根本不需要两个课程。只有一个:)
  • @RokoC.Buljan ?我评论了他应该如何使用单个通用类来切换某些东西。已修复,因为我所做的只是复制他以前的代码,但我用更好的示例对其进行了更新。
  • @JamesJohnston 不,你的建议没问题,我只是说拥有'push-open push-close' 很奇怪。您只需要其中一个(从逻辑上讲,默认样式 - 即考虑 JS-last - 始终处于打开/可见状态。只需要 .push-close :))
  • 所以你有三个不同的点击处理程序,都运行相同的函数——为什么不把它移动到一个命名函数,并创建一个单击处理程序,如`$(".menu-icon, .close -icon, .menu a").on("click", function(){...}) 通过这样做,您不会复制功能。看看codepen.io/anon/pen/RZyNaR#anon-login

标签: jquery mobile menu push


【解决方案1】:

看看这个:

(function(){

    //Mobile Push menu

    //var $mainContent = $('.main-content');
    //var $menuIcon = $('menu-icon');
    var $toggleContent = $('.main-content, .menu-icon');

    $('.menu-icon, .close-icon, .menu a').on('click', function() {
        toggleOpen(); 
    });

    // Close with esc key
    $(document).keyup(function(e) {
      var keyCode = e.which || e.keyCode || e.code;
      if (keyCode === 27) { // escape key maps to keycode `27`
          toggleOpen(); 
      }
    });

    function toggleOpen(){
        if($toggleContent.hasClass('push-open') ){
            $toggleContent.removeClass('push-open').addClass('push-close');
        }else{
            $toggleContent.removeClass('push-close').addClass('push-open');
        }
    }

})(); // End mobilePush

我喜欢模块样式的地方在于,它允许您在函数和事件范围之外声明变量,例如$toggleContent,可以在该模块内部使用,而不会弄乱全局命名空间。

使用 jQuery,您还可以将操作和方法链接在一起,例如 $toggleContent.removeClass('push-open').addClass('push-close');,这绝对有助于提高可读性并消除冗余代码行。

我使用自己的“切换”功能的原因是因为您同时切换了'push-open''push-close'。当我在控制台中观看时,它同时添加/删除了两个类。我怀疑您想删除一个并添加另一个。此外,您可以使用自己的函数添加可能派上用场的回调。

希望有帮助

更新

完全删除了mobilePush,因为它没有必要,并添加了.which

"event.which 属性规范了 event.keyCode 和 event.charCode。 键盘按键输入建议观看 event.which。”

我正在阅读的一件事是 KeyboardEvent.which 已被贬值,现在可以使用event.key(获取角色)或event.code。建议这样做:

var keyCode = e.which || e.keyCode || e.code

如果你仍然需要支持 IE9 以下的任何东西——上帝保佑——,.keyCode 可以工作,但.which 不行。

【讨论】:

  • 为什么要在全球范围内公开mobilePush?您的示例也毫无意义... I suspected you wanted to remove one and add the other ...这正是您的代码所做的:) 您过度设计了toggleOpen 函数。您只需要$toggleContent.toggleClass('push-open push-close'); 一行而不是 5 行。jsfiddle.net/ejt23dku
  • 另外你应该使用规范化的jQueryEvent.which而不是Event.keyCode,而不是===而不是==等等等等......把你的代码(希望它是好的)带到这个: jsfiddle.net/goj5beha - 希望有所帮助
  • .toggleClass() 您建议的方式假设 push-close 已经出现在他的 HTML 元素上。 .which() 是一个有效点,你是对的,他也可以删除 mobilePush。我会更新我的答案。
  • 不。您还可以从 HTML 广告中删除类,它仍然可以工作。我在 HTML 中设置了 close 类,只是为了使按钮最初变为红色。
【解决方案2】:

您的解决方案效果不佳,滚动时您的两个图标都丢失了。页面滚动上的菜单图标和菜单滚动上的关闭图标。
您正在使用一个通用类,这会给您的样式添加混淆。
您正在切换两个类,而您只需要一个默认样式和一个“切换”类。

根本没有JS怎么办?

  • 0行JS
  • 用于切换状态的复选框
  • label 元素来切换我们的复选框
  • 动画取决于复选框的:checked 状态
  • 在 CSS 中使用通用兄弟组合 ~ 来定位所有需要的元素,例如 #over#menu#page...,它们是复选框的下一个兄弟。

给你

@import url("//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css");

/*QuickReset*/ *{margin:0;box-sizing:border-box;} /* Don't transition on "*" !! */
html,body{height:100%;font:14px/1.4 sans-serif;}

/* === CLOSED STYLES === (in order of HTML apperance :D ) */

/* CHECKBOX USED AS MENU TOGGLER */
#ckb { display: none; } /* Hide checkbox button */

/* MENU-BUTTON - notice it's placement in HTML */
#bttn {
  position: fixed;
  z-index: 2;
  top: 0px;
  left: 0px;
  padding: 12px;
  cursor: pointer;
  font-size: 1.3em;
  transition: left .3s, transform .8s; /* will animate left and rotation */
}

/* OVERLAY - To overlay the page and on click closes the menu */
#over{
  position: fixed;
  z-index:1;
  top: 0; 
  left: 0;
  width: 100vw;
  height: 100vh;
  background: rgba(0,0,0,0.6);
  cursor: pointer;
  visibility: hidden;      /* hidden initially */
  opacity: 0;
  transition: opacity .8s; /* we'll transition opacity */
}

/* MENU */
#menu {
  position: fixed;
  overflow-y: auto;
  z-index: 1;
  top: 0;
  left: -285px;
  width: 285px;
  height: 100%;
  background: #fff;
  transition: left .3s;
}
#menu ul {list-style: none; padding: 32px 24px;}
#menu li > * {padding: 5px 10px; display: inline-block; text-decoration: none; color:#f0b; }

/* PAGE AND CONTAINER */
#page {
  position: relative;
  overflow: hidden;
  background: #bbb;
}

.container {
  position: relative;
  left: 0; /* needed since we'll transition this prop */
  background: #eee;
  padding: 32px 56px;
  transition: left .3s;
}

/* === OPEN STYLES === (in order of HTML apperance :D ) */

#ckb:checked ~ #bttn {left: 248px; transform: rotate(180deg);}
#ckb:checked ~ #bttn:before {content: "\f00d";} /* the fa-close character */
#ckb:checked ~ #over {visibility: visible; opacity: 1;}
#ckb:checked ~ #menu {left: 0px;}
#ckb:checked ~ #page > .container {left: 285px;}
<input id="ckb" type="checkbox">
<label for="ckb" id="bttn" class="fa fa-bars"></label>
<label for="ckb" id="over"></label>

<div id="menu">
  <ul>
    <li><label for="ckb">CLICK ME :)</label></li>
    <li><a href="#!">Link One</a></li>
    <li><a href="#!">There's more</a></li>
  </ul>
</div>

<section id="page">
  <div class="container">
    <h1>H1</h1>
    <p style="height:1000px; border:2px dashed gray;">Lorem</p>
  </div>
</section>

【讨论】:

  • 这是一个非常有趣的 CSS 方法,我将不得不研究它是如何工作的。非常感谢!
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多