javascript - 有没有办法重构这个 javascript/jquery?

标签 javascript jquery refactoring case switch-statement

switch (options.effect) {

case 'h-blinds-fadein':
    $('.child').each(function(i) {
        $(this).stop().css({
            opacity: 0
        }).delay(100 * i).animate({
            'opacity': 1
        }, {
            duration: options.speed,
            complete: (i !== r * c - 1) ||
            function() {
                $(this).parent().replaceWith(prev);
                options.cp.bind('click', {
                    effect: options.effect
                }, options.ch);
            }
        });
    });

    break;

case 'h-blinds-fadein-reverse':
    $('.child').each(function(i) {
        $(this).stop().css({
            opacity: 0
        }).delay(100 * (r * c - i)).animate({
            'opacity': 1
        }, {
            duration: options.speed,
            complete: (i !== 0) ||
            function() {
                $(this).parent().replaceWith(prev);
                options.cp.bind('click', {
                    effect: options.effect
                }, options.ch);
            }
        });
    });

    break;

    ....more cases
}

我还有很多类似的案例。我能想到的一种方法是编写函数?我不确定我对这门语言还很陌生

抱歉,i是each()函数的索引,它是$('.child')的大小,r和c只是包含'.child'的网格的'行'和'列'。 child '。 r 和 c 可以是任意数字,例如r=5 c=5

最佳答案

不要使用开关,而是将案例特定数据存储在哈希中。

然后运行主代码块并从哈希中提取任何特定效果类型。

function doit(e) {
    var hash = {
        'h-blinds-fadein': {
            delay: function(i) { return i; },
            complete: function(i) { return (i !== r * c - 1); }
        },
        'h-blinds-fadein-reverse': {
            delay: function(i) { return (r * c - i); },
            complete: function(i) { return i !== 0; }
        }
    }

    $('.child').each(function(i) {
        $(this).stop().css({
            opacity: 0
        }).delay(100 * hash[e].delay(i)).animate({
            'opacity': 1
        }, {
            duration: options.speed,
            complete: hash[e].complete(i) ||
            function() {
                $(this).parent().replaceWith(prev);
                options.cp.bind('click', {
                    effect: options.effect
                }, options.ch);
            }
        });
    });
}

doit(options.effect);

关于javascript - 有没有办法重构这个 javascript/jquery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436753/

相关文章:

javascript - 一页上有多个 svg 的 D3 单击事件

javascript - 要素图层不显示,但要素表显示

javascript - 编写一个 javascript 乘法函数,它将返回两个单独的结果

c# - CSS样式在刷新页面时出错

javascript - Chrome - 专注于 iframe 输入会导致不必要的滚动

javascript - React——为什么循环状态更新先于递归状态更新?

javascript - 如何在表盘上一一涂色

c# - 重构帮助c#

ruby-on-rails - 如何将变量从 let 传递到共享示例?

html - 单击时应用媒体查询特定样式