我正在尝试在javascript / jQuery中进行事件/字符传递,这基本上会将按键事件的“启动”延迟大约2000ms。我已经设置了一个处理程序来捕获所有按键事件并将它们放在缓冲区中。但我无法“回放”存储在缓冲区中的按键序列。
它的工作方式(你会在代码片段中看到这一点)是点击“+”键启动缓冲。点击“+”后,您之后点击的所有键都会存储到缓冲区中。在2000ms之后,缓冲关闭。如果你在点击“+”的2000ms内点击“Enter”,那么缓冲区就会被清空(我在实际代码中正在做其他事情)。但是,如果你没有在2000ms内点击“Enter”,那么需要播放按键。这就是我遇到问题的地方。
当播放keyBuffer
时,我希望字符(触发按键应该产生的字符)出现在用户碰巧所处的输入控件中(在光标处)。但是当我触发事件时,什么都没有出现。我可能完全错了,但我不确定。我还保留了与keyBuffer
一致的字符串(存储在stringBuffer
中,以防我可以使用字符串插入字符(而不是播放按键)。但问题出在那里是我不知道用户可能在哪个输入控件。
有没有办法修改我的代码(下面),以便我以编程方式触发的按键事件(在我的循环中)将使字符显示在聚焦输入控件中?
var checkForSwipe = false;
var stringBuffer = '';
var keyBuffer = [];
$('body').keypress(function (e) {
var charCode = (e.which) ? e.which : e.keyCode
if (charCode == 43) { // "+"
//ENABLE KEY BUFFERING:
e.preventDefault();
e.stopPropagation();
checkForSwipe = true;
stringBuffer = '';
keyBuffer = [];
//AFTER A SET INTERVAL, IF ENTER HAS NOT BEEN PRESSED, THEN REPLAY THE KEYPRESSES:
setTimeout(function () {
checkForSwipe = false;
//REPLAY THE STORED KEYPRESSES:
if (keyBuffer && keyBuffer.length) {
$('#monitor').append('<b>Enter not pressed. Replaying keypresses:</b><br/>');
for (var i in keyBuffer) {
var which = keyBuffer[i]
var press = jQuery.Event("keypress");
press.ctrlKey = false;
press.which = which;
if (which != 43) {
$('#monitor').append(' ' + which + ' ');
$("body").trigger(press);
}
}
}
stringBuffer = '';
keyBuffer = [];
}, 2000);
}
if (e.keyCode == 13) { // "Enter"
if (checkForSwipe) {
e.preventDefault();
e.stopPropagation();
checkForSwipe = false;
stringBuffer += String.fromCharCode(charCode);
keyBuffer.push(e.which);
//DO SOMETHING WITH THE stringBuffer...
//THEN RESET:
stringBuffer = '';
keyBuffer = [];
}
}
//IF "+" HAS BEEN PRESSED IN THE INTERVAL, STORE THE KEYS IN THE BUFFER:
if (checkForSwipe) {
e.preventDefault();
e.stopPropagation();
stringBuffer += String.fromCharCode(charCode);
keyBuffer.push(e.which);
}
});
#monitor {
background-color:#222;
color:#fff;
min-height:100px;
max-height:300px;
overflow:auto;
padding:4px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="i1" />
<input id="i2" />
<input id="i3" />
<input id="i4" />
<input id="i5" />
<div id='monitor'></div>
答案 0 :(得分:1)
我认为如果你利用activeElement,你可以简单地使用你的字符串缓冲区。只需要剥离领先的&#34; +&#34;。
您可以使用selectionStart来识别字符串中插入文本所需的位置。
var checkForSwipe = false;
var stringBuffer = '';
var keyBuffer = [];
$('body').keypress(function (e) {
var charCode = (e.which) ? e.which : e.keyCode
if (charCode == 43) { // "+"
//ENABLE KEY BUFFERING:
e.preventDefault();
e.stopPropagation();
checkForSwipe = true;
stringBuffer = '';
keyBuffer = [];
//AFTER A SET INTERVAL, IF ENTER HAS NOT BEEN PRESSED, THEN REPLAY THE KEYPRESSES:
setTimeout(function () {
checkForSwipe = false;
//REPLAY THE STORED KEYPRESSES:
if (keyBuffer && keyBuffer.length) {
$('#monitor').append('<b>Enter not pressed. Replaying keypresses:</b><br/>');
var currentText = document.activeElement.value;
var currentIndx = document.activeElement.selectionStart;
var newText = currentText.slice(0, currentIndx) + stringBuffer.substr(1) + currentText.slice(currentIndx,currentText.length);
document.activeElement.value = newText;
}
stringBuffer = '';
keyBuffer = [];
}, 2000);
}
if (e.keyCode == 13) { // "Enter"
if (checkForSwipe) {
e.preventDefault();
e.stopPropagation();
checkForSwipe = false;
stringBuffer += String.fromCharCode(charCode);
keyBuffer.push(e.which);
//DO SOMETHING WITH THE stringBuffer...
//THEN RESET:
stringBuffer = '';
keyBuffer = [];
}
}
//IF "+" HAS BEEN PRESSED IN THE INTERVAL, STORE THE KEYS IN THE BUFFER:
if (checkForSwipe) {
e.preventDefault();
e.stopPropagation();
stringBuffer += String.fromCharCode(charCode);
keyBuffer.push(e.which);
}
});
&#13;
#monitor {
background-color:#222;
color:#fff;
min-height:100px;
max-height:300px;
overflow:auto;
padding:4px;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="i1" />
<input id="i2" />
<input id="i3" />
<input id="i4" />
<input id="i5" />
<div id='monitor'></div>
&#13;