2010-08-20 78 views
11

我试图在TEXT区域控件上重现标准的即时通讯行为: 输入作为发送按钮。 ctrl +输入为真实输入。jquery 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可正常工作)。所以我需要正确的多浏览器方式将新行符号插入到textarea中。如果没有手动添加字符串(通过一些基于Ctrl + Enter的事件),它会更好。

更改按键事件不起作用。 “\ r \ n”没有帮助。

测试页位于here

+0

什么是额外的!对于 – Starx 2010-08-20 15:27:05

+0

您是否尝试指定else if(e.keyCode == 13 && e.ctrlKey)? – 2010-08-20 15:30:36

+0

我试过如果(e.keyCode == 13 && e.ctrlKey)也。没有成功。可能不是“\ n”?但我还没有找到任何其他多浏览器的方式。 “\ r \ n”也没有帮助。 在Fire Fox一切正常。 IE只在按下一个字符时才移动到下一行(即回车不起作用) – 2010-08-20 15:42:41

回答

2

几个可能的原因:

定义函数,你引用它之前。

确保您绑定了事件document.ready事件,以便在您引用它时存在dom项目。

更改​​到else if (e.keyCode == 13)

请确定这是一个textarea而不是input[type=text]

考虑使用keypress而不是​​。

使用ctrl修饰键时,某些浏览器会发送keyCode == 10而不是keyCode == 13(即使您没有使用Ctrl修饰键时,某些浏览器也会发送它)。

+0

如果在复制代码时遗忘了。我已经将片段变为现实。订阅已准备就绪。 因此事件正确启动。如果案件正确处理。但没有新的符号。 – 2010-08-20 15:29:01

+0

-2?谨慎解释?这些问题中的任何一个都可能导致这种情况不起作用,我只能继续提供所提供的代码。 – 2010-08-20 15:58:01

+0

我同意,在这种情况下,投票是苛刻的 – Jake 2010-08-20 20:54:41

2

哇,屁股疼得厉害。我一直在玩这一段时间,我不得不认为这只是IE不合作。无论如何,这是今天早上我能做的最好的事情,这是超级哈克,但也许你可以从中获益。

解释:我正在测试ie8,一个textarea元素和快递新。结果可能会不同。 ascii字符173(0xAD)不显示字符,尽管它在移动光标时计为字符。在强制换行之后附加此char可以将光标向下移动。在拨打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; 
} 

如果您尝试在每次击键时进行替换,它将不会很好地工作。你可能可以通过白名单或黑名单来处理这个问题,并找到一种方法将光标放回到应该去的文本中。

0

您可以检查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

关键代码不是问题(请参阅我的评论ti Eton)。它们被正确检测到。所以如果按预期工作。但是添加新行可能不正确(在FF中,Chrome可正常工作)。所以我需要正确的多浏览器方式将新行符号插入到textarea中。如果没有手动添加字符串(通过一些基于Ctrl + Enter的事件),它会更好。 – 2010-08-20 16:02:52

+0

啊,我看到,在你评论和重读你的问题和所有其他评论后,我想我理解你的愿望。我会稍后再看一下(立刻没有时间) – 2010-08-20 16:15:33

16

下面将在所有主要的浏览器,包括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; 
    } 
} 
+0

这比我想出来的要好得多。 – lincolnk 2010-08-20 17:06:05

+0

作品像一个魅力:) – 2010-08-23 06:41:16

+0

应该有'e.preventDefault();'也为了这个工作正常。 – 2017-07-12 21:49:03

0

如果你能排杆+ Enter键,而不是按Ctrl + Enter,然后解决方案是微不足道的。由于Shift + Enter自动触发换行符,因此不需要任何特殊代码。只需简单地回车即可发送。

1

我的答案从Ian Henry的关于keyCode == 10的答案中得到了答案,这似乎是IE中的情况(在8 & 9中测试过)。检查你是否正在处理一个Windows事件并获取关键代码。

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