Как сохранить существующие значения от смещения вправо при вводе нажатий клавиш в jQuery Masked Input? - PullRequest
1 голос
/ 01 апреля 2010

У меня есть текстовое поле, которое я использую в качестве отображения таймера «чч: мм: сс». Когда я выбираю поле и нажимаю число, оно вставляет число в позицию курсора, но вместо замены значения в этом положение, оно сдвигает все существующие значения. Например, текстовое поле таймера гласит «01:00:35», и я заменяю первую минутную позицию на 1, текстовое поле таймера будет читать «01:10:03».

Кто-нибудь знает, как заставить текстовое поле заменять вместо вставки позицию курсора?

Я попытался перехватить onKeyPress, выполнить замену вручную, переписать весь текст таймера, а затем вернуть false. Но это не сработало с вводом в маске jQuery, потому что моя функция запускается первой.

1 Ответ

1 голос
/ 01 апреля 2010

Похоже, это особенность плагина маскируемого ввода. Вы можете попробовать изменить плагин, заменив следующие методы, а затем установите для параметра noshift значение true при вызове его (предупреждение, что я провел минимальное тестирование по этому вопросу, но, похоже, оно работает) $ ( '# ShowTime') маски ( "99:99:99", {noshift: истинный});.

    function shiftL(pos) {
      if(!settings.noshift){
        while (!tests[pos] && --pos >= 0);
        for (var i = pos; i < len; i++) {
          if (tests[i]) {
            buffer[i] = settings.placeholder;
            var j = seekNext(i);
            if (j < len && tests[i].test(buffer[j])) {
              buffer[i] = buffer[j];
            } else
              break;
          }
        }
      }
      writeBuffer();
      input.caret(Math.max(firstNonMaskPos, pos));
    };

    function keypressEvent(e) {
      if (ignore) {
        ignore = false;
        //Fixes Mac FF bug on backspace
        return (e.keyCode == 8) ? false : null;
      }
      e = e || window.event;
      var k = e.charCode || e.keyCode || e.which;
      var pos = $(this).caret();

      if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore
        return true;
      } else if ((k >= 32 && k <= 125) || k > 186) {//typeable characters
        var p = seekNext(pos.begin - 1);
        if (p < len) {
          var c = String.fromCharCode(k);
          if (tests[p].test(c)) {
            if(!settings.noshift) shiftR(p);
            buffer[p] = c;
            writeBuffer();
            var next = seekNext(p);
            $(this).caret(next);
            if (settings.completed && next == len)
              settings.completed.call(input);
          }
        }
      }
      return false;
    };
...