jQuery触发器事件在循环中多次

时间:2016-05-10 19:05:16

标签: javascript jquery events triggers

我将从一些上下文开始:我写了一个小型打字应用程序,它在屏幕上显示文本,并在您使用按键事件键入时跟踪您的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

2 个答案:

答案 0 :(得分:0)

我在简单的jQuery点击事件中遇到了这个问题。我在下面做了,它工作得很好。看看它是否解决了你的问题

jQuery(document).off().on('click', '.my-div', function(){
     // SOME EVENT GOES HERE
})

参考http://api.jquery.com/off/

答案 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">