Получите положение каретки при вводе, чтобы использовать слова при нажатии клавиши, имея возможность редактировать содержимое.

Я решил открыть новый вопрос, потому что я пытался использовать первую букву слова с 4 или более буквами, за исключением нескольких ключевых слов, и у меня есть для этого рабочий код: http://jsfiddle.net/Q2tFx/11/

$.fn.capitalize = function () {
 var wordsToIgnore = ["to", "and", "the", "it", "or", "that", "this"],
    minLength = 3;

  function getWords(str) {
    return str.match(/\S+\s*/g);
  }
  this.each(function () {
    var words = getWords(this.value);
    $.each(words, function (i, word) {
      // only continue if word is not in ignore list
      if (wordsToIgnore.indexOf($.trim(word).toLowerCase()) == -1 && $.trim(word).length > minLength) {
        words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
      }
    });
    this.value = words.join("");
  });
};

$('.title').on('keyup', function () {
  $(this).capitalize();
}).capitalize();

Но у меня возникла проблема при запуске функции keyup. Я не могу редактировать что-либо в середине ввода, не установив курсор в конце ввода. И я также не могу "выбрать все".

Я знаю, что есть решения, позволяющие получить положение курсора и позаботиться о таких вещах, но я действительно не знаю, как интегрировать их в свой код.

Любая идея о том, как я могу это сделать?


person Santiago    schedule 10.01.2013    source источник
comment
Вы хотите использовать заглавные буквы для всех слов или только для первого?   -  person Blake Plumb    schedule 10.01.2013
comment
@BlakePlumb Мне нужно написать все слова с большой буквы. Код с размытием вместо keyup работает так, как мне нужно. Проблема в том, что я хочу использовать заглавные буквы во время ввода, но с помощью keyup я не могу редактировать в середине ввода.   -  person Santiago    schedule 10.01.2013


Ответы (1)


Вы можете сделать это, используя две функции, отсюда: http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea

См. рабочий jsfiddle: http://jsfiddle.net/Q2tFx/14/

$.fn.capitalize = function (e) {
  if(e.ctrlKey) return false;
  var wordsToIgnore = ["to", "and", "the", "it", "or", "that", "this"],
    minLength = 3;

  function getWords(str) {
    return str.match(/\S+\s*/g);
  }
  this.each(function () {
    var words = getWords(this.value);
    $.each(words, function (i, word) {
      // only continue if word is not in ignore list
      if (wordsToIgnore.indexOf($.trim(word).toLowerCase()) == -1 && $.trim(word).length > minLength) {
        words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
      }
    });
    var pos = getCaretPosition(this);
    this.value = words.join("");
    setCaretPosition(this, pos);
  });
};

$('.title').on('keyup', function (e) {
  var e = window.event || evt;
  if( e.keyCode == 17 || e.which == 17) return false;
  $(this).capitalize(e);
}).capitalize();


function getCaretPosition (ctrl) {
    var CaretPos = 0;   // IE Support
    if (document.selection) {
    ctrl.focus ();
        var Sel = document.selection.createRange ();
        Sel.moveStart ('character', -ctrl.value.length);
        CaretPos = Sel.text.length;
    }
    // Firefox support
    else if (ctrl.selectionStart || ctrl.selectionStart == '0')
        CaretPos = ctrl.selectionStart;
    return (CaretPos);
}
function setCaretPosition(ctrl, pos){
    if(ctrl.setSelectionRange)
    {
        ctrl.focus();
        ctrl.setSelectionRange(pos,pos);
    }
    else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}

ПРИМЕЧАНИЕ

Вы должны включить эти две функции в свою область действия с капиталом.

person A. Wolff    schedule 10.01.2013
comment
Большое спасибо. Это просто работает. Один вопрос, знаете ли вы, есть ли обходной путь, чтобы можно было выбрать все с помощью Ctrl + A с этим кодом? Я могу выбрать все, дважды щелкнув по входу, хотя... - person Santiago; 10.01.2013
comment
Обновлен ответ с jsfiddle, чтобы учесть Ctrl + A или любую другую комбинацию с горячей клавишей Ctrl. - person A. Wolff; 10.01.2013