【问题标题】:How to simplify this 3 switch-case functions?如何简化这 3 个 switch-case 功能?
【发布时间】:2016-06-01 19:56:22
【问题描述】:

我想简化这个长长的 jquery/javascript 代码,你能帮帮我吗?我还在学习:)

这是我的 jquery 代码:

$('.pagination-link').click(function() {
  setTimeout(function() {
    currentAnchor = $('body').attr('class');
    switch (currentAnchor) {
      case 'active-slide-1':
        $('#rond').removeClass().addClass('rond1').animate();
        break;
      case 'active-slide-2':
        $('#rond').removeClass().addClass('rond2').animate();
        break;
      case 'active-slide-3':
        $('#rond').removeClass().addClass('rond3').animate();
        break;
      case 'active-slide-4':
        $('#rond').removeClass().addClass('rond4').animate();
        break;
      case 'active-slide-5':
        $('#rond').removeClass().addClass('rond5').animate();
        break;
      case 'active-slide-6':
        $('#rond').removeClass().addClass('rond6').animate();
        break;
      case 'active-slide-7':
        $('#rond').removeClass().addClass('rond7').animate();
        break;
      case 'active-slide-8':
        $('#rond').removeClass().addClass('rond8').animate();
        break;
      default:
        $('#rond').removeClass();
    }
  }, 50);
});

$('.overlay-menu > ul > li > a').click(function() {
  setTimeout(function() {
    currentAnchor = $('body').attr('class');
    switch (currentAnchor) {
      case 'active-slide-1':
        $('#rond').removeClass().addClass('rond1').animate();
        break;
      case 'active-slide-2':
        $('#rond').removeClass().addClass('rond2').animate();
        break;
      case 'active-slide-3':
        $('#rond').removeClass().addClass('rond3').animate();
        break;
      case 'active-slide-4':
        $('#rond').removeClass().addClass('rond4').animate();
        break;
      case 'active-slide-5':
        $('#rond').removeClass().addClass('rond5').animate();
        break;
      case 'active-slide-6':
        $('#rond').removeClass().addClass('rond6').animate();
        break;
      case 'active-slide-7':
        $('#rond').removeClass().addClass('rond7').animate();
        break;
      case 'active-slide-8':
        $('#rond').removeClass().addClass('rond8').animate();
        break;
      default:
        $('#rond').removeClass();
    }
  }, 50);
});

$(window).mousewheel(function() {
  setTimeout(function() {
    currentAnchor = $('body').attr('class');
    switch (currentAnchor) {
      case 'active-slide-1':
        $('#rond').removeClass().addClass('rond1').animate();
        break;
      case 'active-slide-2':
        $('#rond').removeClass().addClass('rond2').animate();
        break;
      case 'active-slide-3':
        $('#rond').removeClass().addClass('rond3').animate();
        break;
      case 'active-slide-4':
        $('#rond').removeClass().addClass('rond4').animate();
        break;
      case 'active-slide-5':
        $('#rond').removeClass().addClass('rond5').animate();
        break;
      case 'active-slide-6':
        $('#rond').removeClass().addClass('rond6').animate();
        break;
      case 'active-slide-7':
        $('#rond').removeClass().addClass('rond7').animate();
        break;
      case 'active-slide-8':
        $('#rond').removeClass().addClass('rond8').animate();
        break;
      default:
        $('#rond').removeClass();
    }
  }, 50);
});

不知道要不要用php来获取currentAnchor的结尾,并把它作为参数。感谢您的帮助!

编辑:我发现我的代码中不需要默认大小写。但是,如果我的默认案例很重要,我会学到一些新东西。所以,这是新的:

            function rondClass() {
                setTimeout(function() {
                    currentAnchor = $('body').attr('class'); 
                    var currentClass = currentAnchor.replace('active-slide-', 'rond');
                    $('#rond').removeClass().addClass(currentClass).animate();
                }, 50);
            }


            $('.pagination-link').click(rondClass);
            $('.overlay-menu > ul > li > a').click(rondClass);
            $(window).mousewheel(rondClass);

谢谢大家!

【问题讨论】:

    标签: javascript jquery switch-statement case simplify


    【解决方案1】:

    您可以将active-slide- 替换为rond

    var currentAnchor = $('body').attr('class');
    var newClass = currentAnchor.replace('active-slide-', 'rond');
    $('#rond').removeClass().addClass(newClass).animate();
    

    要处理默认情况,您可以使用indexOfmatch 处理:

    // indexOf version
    if (currentAnchor.indexOf('active-slide-') !== 0) {
      $('#rond').removeClass();
    } else {
      $('#rond').removeClass().addClass(newClass).animate();
    }
    
    // match version
    if (!currentAnchor.match(/^active-slide-/)) {
      $('#rond').removeClass();
    } else {
      $('#rond').removeClass().addClass(newClass).animate();
    }
    

    【讨论】:

    • 只有一件事要补充,它没有实现default 块。可能需要匹配像 if(currentAnchor.match(/active-slide-\d/) {..} else {..} 这样的正则表达式,以防止添加不属于该模式的类。
    • 如果类是“active-class-a_string_which_is_not_a_number_between_1_and_8_or_no_string_at_all”怎么办?
    • @loxaxs 那么我认为他们需要更好地组织他们的课程;)
    • 通过添加测试len == 1449 <= char && char <= 56 解决了这个问题,其中lenchar 设置为:len = currentAnchor.lengthchar = currentAnchor.charCodeAt(len-1)。 (49是“1”的字符代码,56是“8”的字符代码)
    【解决方案2】:

    用编程方法替换开关/案例并提取函数以避免代码重复。

    var onClick = function() {
      setTimeout(function() {
        currentAnchor = $('body').attr('class'); 
        var slide = currentAnchor.match(/active\-slide\-(\d)/);
        if (slide) {
          $('#rond').removeClass().addClass('rond' + slide[1]).animate();
        } else {
          $('#rond').removeClass();
        }
      }, 50)
    })
    
    $('.overlay-menu > ul > li > a').click(onClick);
    $('.pagination-link').click(onClick);
    

    【讨论】:

    • 是否可以为每种情况创建一个函数?我试过但没有工作: function rondclass() { //myfunction } $('.pagination-link').click(function rondclass()); $('.overlay-menu > ul > li > a').click(function rondclass()); $(window).mousewheel(function rondclass());
    • @PauleAnne 要将函数作为参数传递,只需给出不带括号的名称即可。所以它会是$(window).mousewheel(rondclass); 例如。
    • 是的,建议尽可能重用函数。
    • @4castle 谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多