首页 > 解决方案 > 尝试制作自动点击器的 javascript 新手

问题描述

我能够让空格键激活我制作的简单按钮,但我在使用 setInterval() 循环时遇到问题。是因为我使用了 eventFire 机制吗?欢迎任何帮助或建设性的批评,因为我正在努力学习。谢谢你的时间。

编辑:我能够找到解决方案,因为我显然错误地使用了 setInterval 函数。但是,我仍然有使用 clearInterval(timer) E 热键停止 setInterval 循环的问题。这是更新的代码。

"use strict";
// used for Tracking Mouse Position which I will implement later
let mousex;
let mousey;

// Simple Button that logs the amount of times pressed and triggers an animation
function button() {
  const button = document.querySelector(".button");

  function buttonClassRemove() {
    button.classList.remove("active");
  }

  function delay(time, inputFunction) {
    let milliseconds = time;
    setTimeout(function () {
      inputFunction();
    }, milliseconds);
  }
  let i = 0;
  button.addEventListener("click", function () {
    i = i + 1;
    console.log(`Button pressed ${i} times`);
    button.classList.add("active");
    delay(100, buttonClassRemove);
  });
}
// Simulates event
function eventFire(el, etype) {
  if (el.fireEvent) {
    el.fireEvent("on" + etype);
  } else {
    var evObj = document.createEvent("Events");
    evObj.initEvent(etype, true, false);
    el.dispatchEvent(evObj);
  }
}

function autoClicker() {
  document.addEventListener("mousemove", () => {
    // Tracking Mouse Position
    mousex = event.clientX; // Gets Mouse X

    mousey = event.clientY; // Gets Mouse Y
    // console.log([mousex, mousey]); // Prints data
  });

  document.body.onkeydown = function (e) {
    // Simulates click mouse event
    // and then loop that functionality with the setInterval function
    let timer = setInterval(function () {
  eventFire(document.getElementById("button1"), "click");
}, 100);

    if (e.keyCode == 32) {
      timer;
      console.log("Space pressed");
    } else if (e.keyCode == 69) {
      // Cancels autoclicker setInterval function
      clearInterval(timer);
      console.log("E pressed");
    }
  };
}

autoClicker();
button();

标签: javascriptautomation

解决方案


您的问题是这timer是一个局部变量。您应该var在程序开始时将其定义为mousexmousey。按照目前的情况,每次运行onkeydown它都会创建一个间隔的新实例,检查是否取消它,然后丢弃引用。如果将其设为全局变量,则可以保留引用,以便随时取消它。

有了这个,您还应该考虑何时运行间隔。如果您保持原样,您的旧间隔将被新间隔覆盖,然后您可以检查以取消。你应该做的是这样的:

var timer = null;
document.body.onkeydown = function(e) {
    if (/* start timer */ && timer == null) {
        timer = setInterval(/* ... */);
    } else if (/* end timer */) {
        clearInterval(timer);
        timer = null;
    }
}

推荐阅读