我正在尝试在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;
}
我已尝试使用注释行和不使用注释行。不行。简单的输入按预期工作。 任何想法如何在ctrl + enter上添加回车?
关键代码没问题。它们被正确检测到。所以如果按预期工作的话。但添加新行的工作不正确(在FF中,Chrome可正常工作)。所以我需要正确的多浏览器方式将新行符号插入textarea。如果没有手动添加字符串(通过基于ctrl + enter的某些事件),它会更好。
更改按键事件无效。 “\ r \ n”没有帮助。
位于here的测试页
答案 0 :(得分:18)
以下内容适用于所有主流浏览器,包括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;
}
}
答案 1 :(得分:2)
一些可能的原因:
在引用之前定义函数。
确保您在document.ready
事件中绑定事件,以便在引用它时存在dom项。
将else (e.keyCode == 13)
更改为else if (e.keyCode == 13)
。
确保这是textarea
,而不是input[type=text]
。
请考虑使用keypress
代替keydown
。
使用ctrl修饰键时,有些浏览器会发送keyCode == 10
而不是keyCode == 13
(有些浏览器会在你不使用ctrl修饰键的情况下发送它)。
答案 2 :(得分:2)
解释:我正在测试ie8,textarea元素和courier new。结果可能有所不同ascii character 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;
}
如果你尝试在每次击键时进行替换,那么它就不会很好用。您可以通过白/黑名单键来处理这个问题,并找到一种方法将光标放回文本中应该去的位置。
答案 3 :(得分: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
}
});
答案 4 :(得分: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/
答案 5 :(得分:0)
如果您坚持使用Shift + Enter而不是Ctrl + Enter,则解决方案很简单。您不需要任何特殊代码,因为Shift + Enter会自动触发换行符。只需抓住普通的Enter即可进行发送。