Подтвердить что ты не робот

Jquery ctrl + ввести как ввести в текстовую область

Я пытаюсь воспроизвести стандартное поведение мессенджера при управлении областью TEXT: введите работу как кнопка отправки. ctrl + введите как реальный ввод.

 $("#txtChatMessage").keydown(MessageTextOnKeyEnter);
 function MessageTextOnKeyEnter(e)
 {
    if (!e.ctrlKey && e.keyCode == 13)
    {
       SendMessage();
       return false;
    }
    else if(e.keyCode == 13)
    {
       $(this).val($(this).val() + "\n");
    }
    return true;
 }

Я пробовал как с прокомментированной строкой, так и без нее. Не работает. простой ввод работает, как ожидалось. Любые идеи о том, как добавить enter на ctrl + enter?

key code не проблема. они обнаруживаются правильно. поэтому все, если работает, как ожидается. Но добавление новой строки работает неправильно (в FF Chrome работает правильно). Поэтому мне нужен правильный способ многострочного ввода вставки нового символа строки в textarea. Если без добавления строки вручную (по какому-либо событию на основе ctrl + enter), это будет лучше.

изменение события нажатия клавиши не влияет. "\ r\n" не помогло.

тестовая страница расположена здесь

4b9b3361

Ответ 1

Следующее будет работать во всех основных браузерах, включая IE. Он будет вести себя точно так же, как если бы клавиша ввода нажата, когда вы нажимаете ctrl-enter:

function MessageTextOnKeyEnter(e) {
    if (e.keyCode == 13) {
        if (e.ctrlKey) {
            var val = this.value;
            if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
                var start = this.selectionStart;
                this.value = val.slice(0, start) + "\n" + val.slice(this.selectionEnd);
                this.selectionStart = this.selectionEnd = start + 1;
            } else if (document.selection && document.selection.createRange) {
                this.focus();
                var range = document.selection.createRange();
                range.text = "\r\n";
                range.collapse(false);
                range.select();
            }
        }
        return false;
    }
}

Ответ 2

Несколько потенциальных причин:

Определите функцию, прежде чем ссылаться на нее.

Убедитесь, что вы привязываете событие в событии document.ready, так что элемент dom существует, когда вы ссылаетесь на него.

Измените else (e.keyCode == 13) на else if (e.keyCode == 13).

Убедитесь, что это textarea, а не input[type=text].

Рассмотрим keypress вместо keydown.

Некоторые браузеры будут отправлять keyCode == 10 вместо keyCode == 13 при использовании ключа модификатора ctrl (некоторые браузеры отправят его, даже если вы не используете ключ модификатора ctrl).

Ответ 3

Вау какая боль в заднице. Я играл с этим некоторое время, и я должен предположить, что это просто несовместимый с IE. во всяком случае, это лучшее, что я мог сделать сегодня утром, и это супер хаки, но, может быть, вы можете что-то выиграть от него.

Объяснение: я тестирую с ie8, элемент textarea и новый курьер. результаты могут отличаться. Символ ascii 173 (0xAD) не отображает символ, хотя при перемещении курсора он считается символом. добавив этот char после того, как вы нажмете новую строку, т.е. переместите курсор вниз. перед вызовом SendMessage мы заменим лишний char ничем.

function MessageTextOnKeyEnter(e) 
 { 
    var dummy = "\xAD";
    if (!e.ctrlKey && e.keyCode == 13) 
    { 
        var regex = new RegExp(dummy,"g");
        var newval = $(this).val().replace(regex, '');
        $(this).val(newval);

       SendMessage(); 
       return false; 
    } 
    else if(e.keyCode == 13) 
    { 
       $(this).val($(this).val() + "\n" + dummy); 
    } 
    return true; 
 } 

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

Ответ 4

Мой ответ приводит от Ян Генри ответ о keyCode == 10, который, похоже, имеет место в IE (тестируется в 8 и 9). Проверьте, имеете ли вы дело с событием windows и ket key code.

  $('#formID #textareaID').keypress(function(e) {
    if(window.event) {
      var keyCode = window.event.keyCode;     
    }
    else {
      var keyCode = e.keyCode || e.which;
    }

    if( (!e.ctrlKey && (keyCode == 13)) ) {
      //do stuff and submit form
    }
    else if( (e.ctrlKey && (keyCode == 13)) || (keyCode == 10) ) {
      //do stuff and add new line to content
    }                  
  });

Ответ 5

Вы можете проверить ctrl и alt, как в

$(document).ready(function() {
    $('#myinput').keydown(function(e) {
        var keysare = 'key code is: ' + e.which + ' ' + (e.ctrlKey ? 'Ctrl' : '') + ' ' + (e.shiftKey ? 'Shift' : '') + ' ' + (e.altKey ? 'Alt' : '');
        //alert(keysare);
        $('#mycurrentkey').text(keysare);
        return false;
    });
});

См. рабочий пример здесь: http://jsfiddle.net/VcyAH/

Ответ 6

Если вы можете придерживаться Shift + Enter вместо Ctrl + Enter, то решение тривиально. Вам не нужен специальный код, так как Shift + Enter автоматически запускает автоматический разрыв строки. Просто поймите plain Enter, чтобы выполнить отправку.