Слишком много утверждений if-else. Могут ли они стать глобальными? - PullRequest
3 голосов
/ 10 февраля 2012

Я пытаюсь упростить этот скрипт.У меня есть 50 из этих if e.keyCode операторов, поэтому двойное вложение операторов if / else кажется нелепым, но все остальные мои попытки не сработали.

Первый оператор if / else if(e.keyCode == 66 && e.shiftKey) необходим, но я не уверен насчет второго if (typedAdjusted >= paperWidth % charWidth), который выдает предупреждение, если слишком много символов напечатано в строке относительно фиксированной ширины.

Может ли функциональность if (typedAdjusted >= paperWidth % charWidth) дать мне глобальный характер?Это нужно будет проверить по определенным кодам клавиш.Например, буква «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;
        }        
    }
}

Ответы [ 3 ]

6 голосов
/ 10 февраля 2012

Что вы имеете в виду, имея 50 из них? Вы ... не имеете в виду один для каждой буквы?

А почему вы дважды проверяете значение кода клавиши? Вы видите, что код точно идентичен, кроме символа?

Сохраните таблицу поиска или прямой перевод символов и сократите ее до одного метода:

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];
}
2 голосов
/ 10 февраля 2012

Если вам нравится проверять каждый, используйте переключатель: при необходимости вызывайте функцию 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' в приведенном выше коде.

0 голосов
/ 11 февраля 2012

Если вы наблюдаете событие нажатия клавиши, вы можете использовать String.fromCharCode(event.keyCode) для ввода введенного символа, и вам не придется возиться с таблицей поиска.

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