jquery ctrl + enter в качестве ввода в текстовой области

Я пытаюсь воспроизвести стандартное поведение программы обмена мгновенными сообщениями в элементе управления ТЕКСТ: ввод работает как кнопка отправки. 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;
 }

Я пробовал как с закомментированной строкой, так и без нее. Не работает. простой ввод работает должным образом. Есть идеи, как добавить ввод с помощью Ctrl + Enter? Код клавиши

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

изменение при нажатии клавиши не имеет никакого эффекта. "\ r \ n" не помогло.

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

12
задан Yauhen.F 20 August 2010 в 16:29
поделиться

4 ответа

Несколько возможных причин:

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

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

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

Убедитесь, что это текстовое поле , а не вход [type = text] .

Рассмотрите возможность использования нажатия клавиши вместо нажатия клавиши .

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

2
ответ дан 2 December 2019 в 06:44
поделиться

Вы можете проверить 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/

0
ответ дан 2 December 2019 в 06:44
поделиться

Следующее будет работать во всех основных браузерах, включая 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;
    }
}
18
ответ дан 2 December 2019 в 06:44
поделиться

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

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

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; 
 } 

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

2
ответ дан 2 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: