jquery ctrl+enter as enter in text area

后端 未结 6 1931
南旧
南旧 2020-12-30 07:33

I am trying to reproduce standard instant messenger behavior on TEXT area control: enter works as send button. ctrl+enter as real enter.

 $(\"#txtChatMessag         


        
相关标签:
6条回答
  • 2020-12-30 07:49

    My answer leads from Ian Henry's answer about keyCode == 10, which seems to be the case in IE (tested in 8 & 9). Check if you are dealing with a windows event and ket the 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
        }                  
      });
    
    0 讨论(0)
  • 2020-12-30 08:04

    You can check for the ctrl and alt as in

    $(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;
        });
    });
    

    See a working example here: http://jsfiddle.net/VcyAH/

    0 讨论(0)
  • 2020-12-30 08:08

    The following will work in all the major browsers, including IE. It will behave exactly as though the enter key had been pressed when you press 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;
        }
    }
    
    0 讨论(0)
  • 2020-12-30 08:09

    If you can stick with Shift+Enter instead of Ctrl+Enter then the solution is trivial. You don't need any special code as Shift+Enter triggers a line break automatically. Just catch plain Enter to do the sending.

    0 讨论(0)
  • 2020-12-30 08:12

    A few potential causes:

    Define the function before you reference it.

    Make sure you're binding the event in the document.ready event, so that the dom item exists when you reference it.

    Change else (e.keyCode == 13) to else if (e.keyCode == 13).

    Make sure this is a textarea, not an input[type=text].

    Consider using keypress instead of keydown.

    Some browsers will send keyCode == 10 instead of keyCode == 13 when using the ctrl modifier key (some browsers will send it even when you aren't using the ctrl modifier key).

    0 讨论(0)
  • 2020-12-30 08:12

    wow what a pain in the ass. i've been playing with this for a while and i have to assume this is just IE being uncooperative. anyway, this is the best i could do this morning and it's super hacky, but maybe you can gain something from it.

    explanation: i'm testing with ie8, a textarea element, and courier new. results may vary. ascii character 173 (0xAD) does not display a character, although it counts as a character when moving your cursor around. appending this char after you force a newline gets ie to move the cursor down. before the call to SendMessage we replace the extra char with nothing.

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

    if you try to do the replacement on every keystroke it's not going to work very well. you might be able to deal with this by white/blacklisting keys and find a method to put the cursor back in the text where it's supposed to go.

    0 讨论(0)
提交回复
热议问题