jquery ctrl +在文本区域输入as
我试图在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”没有帮助。
测试页面位于此处
以下内容适用于所有主流浏览器,包括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; } }
一些潜在的原因:
在引用之前定义函数。
确保您在document.ready
事件中绑定事件,以便在引用它时存在dom项。
else if (e.keyCode == 13)
将else if (e.keyCode == 13)
更改为else if (e.keyCode == 13)
。
确保这是一个textarea
,而不是input[type=text]
。
考虑使用keypress
而不是keydown
。
当使用ctrl修饰键时,某些浏览器会发送keyCode == 10
而不是keyCode == 13
(即使你没有使用ctrl修饰键,某些浏览器也会发送它)。
哇屁股什么痛苦。 我已经玩了一段时间了,我不得不假设这只是IE不合作。 无论如何,这是我今天早上能做到的最好的,而且超级黑客,但也许你可以从中获得一些东西。
解释:我正在测试ie8,textarea元素和courier new。 结果可能有所不同 ascii character 173(0xAD)不显示字符,虽然它在移动光标时计为字符。 在强制换行后获取此字符,即向下移动光标。 在调用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; }
如果你试图在每次击键时进行更换,那么它的效果不会很好。 您可以通过白名单/黑名单键来处理这个问题,并找到一种方法将光标放回到它应该去的文本中。
我的答案来自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 } });
你可以检查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/
如果您坚持使用Shift + Enter而不是Ctrl + Enter,则解决方案很简单。 您不需要任何特殊代码,因为Shift + Enter会自动触发换行符。 只需抓住普通Enter即可进行发送。