关闭并重新打开popup.js后,无法停止在Chrome扩展程序中自我执行setTimeout

问题描述

我想编写一个扩展名,该扩展名每隔X秒在同一选项卡中打开一个URL。我打开popup.html,填写网址,延迟,然后按开始。扩展名开始每X秒更新页面URL。当我保留popup.html时,我可以停止该过程,但是当我关闭它并重新打开弹出窗口时,停止按钮不会将消息发送到background.js。这是我的代码,对不起,我真的是这方面的绝对初学者。

backgrounds.js

var interval;
var repeater;
var start,end;
var completed = false;

function changePage(newUrl) {
  chrome.tabs.query({ currentwindow: true,active: true },function (tab) {
    console.log(tab);
    console.log(newUrl);
    chrome.tabs.update(tab.id,{
      url: newUrl,});
  });
}

function update_page(data) {
  let newUrl = data.url + alphanum[start];
  if (start === end) {
    completed = true;
    changePage(newUrl);
  } else {
    changePage(newUrl);
  }

  // deciding the order
  if (data.start[0] < data.end[0]) {
    start++;
  } else if (data.start[0] === data.end[0]) {
    if (data.start[1] < data.end[1]) {
      start++;
    } else {
      start--;
    }
  } else {
    start--;
  }
}

chrome.runtime.onConnect.addListener(function (port) {
  port.onMessage.addListener(function (msg) {
    console.log(msg);
    if (msg !== "stop") {
      completed = false;
      start = alphanum.findindex((e) => e === msg.start);
      end = alphanum.findindex((e) => e === msg.end);
      console.log(start,end);
      console.log(completed);
      console.log(msg);
      (function a() {
        if (!completed && msg !== "stop") {
          console.log(completed);
          update_page(msg);
          repeater = setTimeout(a,msg.timeout);
        } else {
          clearInterval(repeater);
        }
      })();
    } else if (msg === "stop") {
      completed = true;
      clearInterval(repeater);
    }
  });
});

popup.js

document.addEventListener("DOMContentLoaded",function () {
  document.getElementById("start").addEventListener("click",start);
  document.getElementById("stop").addEventListener("click",stop);
});

var port;
function start(event) {
  event.preventDefault();
  port = chrome.runtime.connect({
    name: "opener",});
  let timeout = document.getElementById("timeout").value * 1000;
  let url = document.getElementById("url").value;
  let start = document.getElementById("st").value;
  let end = document.getElementById("end").value;
  var good_url_regex = new RegExp(
    /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi
  );
  var alphanumeric_string_regex = new RegExp(/^[a-z0-9]+$/i);
  if (url && timeout && start && end) {
    if (url.match(good_url_regex)) {
      if (
        start.match(alphanumeric_string_regex) &&
        end.match(alphanumeric_string_regex)
      ) {
        if (start.length < 2 || end.length < 2) {
          alert(
            "Hibás intervallumot adtál meg. Az intervallum tagjai mindkettő 2 karakterből kell hogy álljon!"
          );
        } else {
          port.postMessage({ timeout,url,start,end });
          port.onMessage.addListener(function (msg) {
            console.log("message recieved: " + msg);
          });
        }
      } else {
        alert(
          "Helytelen intervallumot adtál meg. A Kezd és Befejez mezők mindkettő 2-2 alfanumerikus karakterből kell álljon."
        );
      }
    } else {
      alert("Helytelen weboldal. Kérlek ellenőrizd!");
    }
  } else {
    alert("Kérlek tölts ki minden mezőt!");
  }
}

function stop(event) {
  event.preventDefault();
  port.postMessage("stop");
  port.onMessage.addListener(function (msg) {
    console.log("message recieved: " + msg);
  });
}

删除了一些对这个问题没有意义的内容。附加信息,扩展名从aa到ZZ,您输入一个URL,它将两个字符添加到URL的末尾,并在延迟后将其打开。 如果我没有为这些东西使用正确的API,请帮助我找到正确的方法我有点卡在这里,不知道我在做什么错。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)