javascript - 避免重复代码

时间:2017-08-25 21:44:15

标签: javascript jquery user-interface dry

我有一个页面,其中包含一个调用菜单模式的按钮。模态包含两个调用两个子菜单的按钮 - 每个按钮一个。看笔: https://codepen.io/t411tocreate/pen/yoxJGO

它确实有效。但目前的问题是我重写了一个可重复的代码来调用每个子菜单:

$('.show-submenu-1').on('click', function () {
  $('.submenu-1.offcanvas').addClass('offcanvas--active');
})

$('.show-submenu-2').on('click', function () {
  $('.submenu-2.offcanvas').addClass('offcanvas--active');
})

这种做法似乎相当愚蠢。我需要一个重复性较低的解决方案,例如forEach函数用于数组:

var menus = [
  '.show-submenu-1',
  '.show-submenu-2'
];

menus.forEach(function(menu){
  $(menu).on('click', function () {
    $(`${menu}.offcanvas`).addClass('offcanvas--active');
  })
});

当然,这种情况不会起作用。如何让我的代码干?

4 个答案:

答案 0 :(得分:2)

使用标记:

<div class="submenu" data-index="1">
<div class="submenu" data-index="2">

<button class="show-submenu-button" data-submenu-index="1">
<button class="show-submenu-button" data-submenu-index="2">

然后:

$('.show-submenu-button').on('click', function () {
    var index = $(this).attr('data-submenu-index');
    $('.submenu[data-index="' + index + '"]').addClass('offcanvas--active');
})

使用特定的类名来分别识别页面上的每个元素几乎没有价值。类名应该定义一个行为相同的元素。

答案 1 :(得分:1)

试试这个:

var menus = [1, 2];

menus.forEach(index => {
  $(`.show-submenu-${index}`).on('click', () => {
    $(`.submenu-${index}.offcanvas`).addClass('offcanvas--active');
  });
});

答案 2 :(得分:1)

嗨,我希望我的问题是正确的,但你可以使用数据属性来做这样的事情。只需为.show-submenu设置一个通用类,并使用data-submenu = x属性中的数字标记它们与菜单的连接。其中x是.submenu-x中的数字。 然后你做这样的事情: 请注意,我将.show-submenu-1更改为.show-submenu。确保每个触发器都有此类。还要为要使用的每个子菜单添加data-submenu = x。

$('.show-submenu').on('click', function () {
  var number = $(this).attr("data-submenu");
  var selector = '.submenu-' + number + '.offcanvas'
  $(selector).addClass('offcanvas--active');
})

因此数据子菜单用于配对触发器和模态。通过这种方式,您可以坚持使用易于阅读的HTML代码和一小段jquery。

答案 3 :(得分:-1)

你也可以使用它。

$('.show-submenu-1, .show-submenu-2').on('click', function (event) {
$(event.target).hasClass('show-submenu-1'){
   $('.submenu-1.offcanvas').addClass('offcanvas--active');
}else{
  $('.submenu-2.offcanvas').addClass('offcanvas--active');
} 
})

最好将show-submenu-1(如showmenu)和子菜单-1(作为子菜单)放在同一个父元素中,以允许您使用closest()方法并简化生活

例如:

$('.show-submenu').on('click', function (event) {
    $(event.target).closest('.submenu').addClass('offcanvas--active');
    })