我将从一些上下文开始:我写了一个小型打字应用程序,它在屏幕上显示文本,并在您使用按键事件键入时跟踪您的wpm。出于无聊,我想稍微玩一下它并且有一种方法可以在输入隐藏命令后自动输入(仅使用箭头键缩短kontra代码)。所以我有一个字符数组,我正在迭代并尝试模拟我的每个循环中的按键事件,如下所示。
$.each(_arrToCopy, function (index, value) {
setTimeout(function () {
console.log(value);
jQuery.event.trigger({ type: 'keypress', which: value.charCodeAt(0) });
//typeIt(value);
}, time);
time += 500;
});
我遇到的问题是,我的事件似乎只触发了一次,然后再没有触发。 setTimeout函数是一个早期尝试减慢循环,以防我只是处理太快。之后没有用,我实现了一个几乎纯粹的javascript函数(typeIt())函数来伪造键盘事件。它在下面。
function typeIt(character) {
var keyboardEvent = document.createEvent("KeyboardEvent");
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";
console.log(String.fromCharCode(character.charCodeAt(0)) + ' ' + (character.charCodeAt(0)));
keyboardEvent[initMethod](
"keypress", // event type : keydown, keyup, keypress
true, // bubbles
true, // cancelable
window, // viewArg: should be window
false, // ctrlKeyArg
false, // altKeyArg
false, // shiftKeyArg
false, // metaKeyArg
0, // keyCodeArg
character.charCodeAt(0) // charCodeArgs
);
document.dispatchEvent(keyboardEvent);
}
这也输入一次,但似乎输入了错误的字符。所以我回过头来试图让jQuery触发器工作,并且已经陷入困境。我可以让它输入第一个字母,但之后它似乎完全停止了射击。我想知道是否有可能重置事件触发器的方法,如果它只能在循环中触发一次而不被重置,或者这甚至是问题。
如果为了更多的上下文你想看一下这是什么,我在这里有一个模拟(虽然我实际上正在研究的是现在更精致的c#app将是一个完整的后端):http://codepen.io/jiggawagga/pen/wBoaRY
先谢谢团队stackoverflow
答案 0 :(得分:0)
我在简单的jQuery
点击事件中遇到了这个问题。我在下面做了,它工作得很好。看看它是否解决了你的问题
jQuery(document).off().on('click', '.my-div', function(){
// SOME EVENT GOES HERE
})
答案 1 :(得分:0)
我将您的代码复制到jsfiddle进行试用。为了让它发挥作用,我唯一需要改变的是改变它:
jQuery.event.trigger({ type: 'keypress', which: value.charCodeAt(0) });
到此:
$('#out').trigger({ type: 'keypress', which: value.charCodeAt(0)});
基本上在要接收它的元素上触发事件。我不太熟悉jQuery,所以这可能不是你所追求的解决方案。但它对我有用。
小提琴的完整js:
var _arrToCopy = Array.prototype.slice.call("lorem ipsum");
var time = 0;
$('#out').keypress(function(e){
$(this).text($(this).text() + String.fromCharCode(e.which));
});
$.each(_arrToCopy, function (index, value) {
setTimeout(function () {
console.log(value);
$('#out').trigger({ type: 'keypress', which: value.charCodeAt(0)});
}, time);
time += 500;
});
HTML:
<p id="out">