【问题标题】:Too many if-else statements. Can they be made global?if-else 语句太多。它们可以全球化吗?
【发布时间】:2012-02-10 19:10:53
【问题描述】:

我正在尝试简化此脚本。我有 50 个这样的 if e.keyCode 语句,所以双重嵌套 if/else 语句看起来很荒谬,但我所做的所有其他尝试都没有奏效。

第一个 if/else 语句 if(e.keyCode == 66 && e.shiftKey) 是必要的,但我不确定第二个 if (typedAdjusted >= paperWidth % charWidth) 如果在相对于固定宽度的行上键入了太多字符,则会引发警告。

if (typedAdjusted >= paperWidth % charWidth) 给我的功能可以是全球性的吗?需要根据特定的 keyCodes 对其进行检查。例如,字母“B”应该输入到 typedAdjusted 中,而 BACKSPACE 和 TAB 和 COMMAND 则不应该。

var typed = $("span.char").length;
var typedAdjusted = typed+1;
var paperWidth = 900;
var charWidth = 44;

if (e.keyCode  == 66)  {
    if (e.keyCode  == 66  && e.shiftKey)  {
        $('#charLine-1').append('<span class="char">B</span>');
        if (typedAdjusted  >= paperWidth % charWidth) {
            $('body').append('<span id="warning">WARNING!</span>');
        }
        else {
            return false;
        }
    } 
    else  {
        $('#charLine-1').append('<span class="char">b</span>');
        if (typedAdjusted  >= paperWidth % charWidth) {
            $('body').append('<span id="warning">WARNING!</span>');
        }
        else {
            return false;
        }        
    }
}

【问题讨论】:

    标签: javascript jquery if-statement global-variables


    【解决方案1】:

    你说有 50 个是什么意思?你……不是每个字母一个吗?

    为什么要两次检查 keycode 值?除了字符之外,您看到代码完全相同吗?

    保留一个查找表,或直接进行字符翻译,并将其缩短为单一方法:

    var c = lookup(e.keyCode, e.shiftKey);
    $('#charLine-1').append('<span class="char">' + c + '</span>');
    if (typedAdjusted  >= paperWidth % charWidth) {
        $('body').append('<span id="warning">WARNING!</span>');
    } else {
        return false;
    }
    

    这将创建一大堆跨度。


    var normal = {
      66: 'b', 67: 'c', // etc.
    };
    
    var shifted = {
      66: 'B', 67: 'C', // etc.
    };
    
    /** 
     * Looks up keycode using appropriate map.
     *
     * Returns `undefined` if not found; shouldn't insert.
     */
    function lookup(code, shift) {
      return shift ? shifted[code] : normal[code];
    }
    

    【讨论】:

    • 其中有 50 个,因为我正在创建一个基于具有 50 个键的真实打字机的虚拟打字机。所有 50 个键都有一个 if(e.keyCode == ##)。键码检查两次以说明键码组合(shift+b = B;shift+2 = @)。感谢有关查找表的提示。我会尝试一下,看看它是否适合我(JS 新手,刚刚知道它们的存在)。
    • @pardon 但是你不需要重新检查keycode;如果它通过了第一个if,您已经知道密钥代码就是您检查的内容。但是查找表是一个更合理的解决方案。它只是一个映射/哈希或数组,J. Random Mechanism 用于处理移位——添加索引偏移量、切换映射/数组等等。
    • 非常感谢您的建议。希望这会有所帮助。对哈希有点困惑。您是否建议类似:var myChar = {}; myHash['a'] = [65]; myHash['b'] = [66]; myHash['c'] = [67]; 并在 shiftkey 检测时调用... var myShiftChar = {}; myHash['A'] = [65]; myHash['B'] = [66]; myHash['C'] = [67];
    • @pardon 查看更新的答案。您的哈希是向后的,您想根据代码而不是字母进行查找。您的还为每个条目创建一个单元素数组。
    【解决方案2】:

    如果您喜欢检查每个使用开关:根据需要调用 checkKey 函数传递事件。

    function checklen() {
        var typed = $("span.char").length;
        var typedAdjusted = typed + 1;
        var paperWidth = 900;
        var charWidth = 44;
        return (typedAdjusted >= paperWidth % charWidth);
    }
    
    function checkKey(e) {
        var mychar = '';
        var checkit = false;
        switch (e.keyCode) {
        case 66:
            mychar = e.shiftKey ? 'B' : 'b';
            checkit = checklen();
            break;
        case 67:
            mychar = e.shiftKey ? 'C' : 'c';
            checkit = checklen();
            break;
        case 68:
            mychar = e.shiftKey ? 'D' : 'd';
            checkit = checklen();
            break;
    
        default:
            checkit = false;
            break;
        }
        if (!checkit) {
            $('#charLine-1').append('<span class="char">' + mychar + '</span>');
        }
        else {
            $('body').append('<span id="warning">WARNING!</span>');
        }
    }
    

    让它在整个文档上工作:

    $(document).ready(function(){
      $(document).keydown(function(e) { 
         checkKey(e);
      });
    });
    

    然后只需单击页面并输入字符 - 请注意上面代码中的“b”、“c”、“d”。

    【讨论】:

    • mychar = e.shiftKey ? mychar = 'B' : mychar = 'b'; 这似乎有点多余:P
    • @MarkSchultheiss 这似乎是我应该走的方向,但似乎行不通 — jsbin.com/owaraw/2
    • 我修正了我愚蠢的快速输入语法:) 示例:jsfiddle.net/MarkSchultheiss/6Svcb
    • 注意:如果您希望不附加默认值,请确保更改其中的 checkit=false; 语句。请注意,我正在(在我的示例页面中)使用用于键检测的输入元素。您的可能会有所不同。
    • @MarkSchultheiss jsfiddle 似乎已关闭。我在jsbin.com/owaraw/8/edit 将编辑后的代码弹出到 jsbin 中,但这似乎也不起作用。
    【解决方案3】:

    如果您观察到按键事件,您可以使用String.fromCharCode(event.keyCode) 来获取输入的字符,而不必弄乱查找表。

    function (event) {
        var key = event.keyCode;
        if (key > 31 && key < 127) return String.fromCharCode(key);
    }
    

    【讨论】:

    • 是的,它会的。至少它在 Chrome 中对我有用。如果我按“a”键,它会返回“a”;如果我按 Shift+a,它会返回“A”。如果我按 2,它会返回“2”;如果我按 Shift+2,它会返回“@”。如果您仍需要知道 shift 键是否被按下,请查看event.shiftKey
    • 不幸的是,我不会使用键盘的默认键码组合。例如,在我的键盘上shift + 6 = ^,但我需要shift + 6 = -
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多