Javascript Can';关闭并重新打开popup.js后,在Chrome扩展中停止自动执行setTimeout
我想写一个扩展,每X秒在同一个选项卡中打开一个url。我打开popup.html,填写url和延迟,然后按start。扩展插件开始每X秒更新一次页面url。当我打开popup.html时,我可以停止进程,但当我关闭它并重新打开popup时,停止按钮不会将消息发送到background.js。这是我的代码,对不起,我是这方面的新手 backgrounds.jsJavascript Can';关闭并重新打开popup.js后,在Chrome扩展中停止自动执行setTimeout,javascript,html,google-chrome,google-chrome-extension,settimeout,Javascript,Html,Google Chrome,Google Chrome Extension,Settimeout,我想写一个扩展,每X秒在同一个选项卡中打开一个url。我打开popup.html,填写url和延迟,然后按start。扩展插件开始每X秒更新一次页面url。当我打开popup.html时,我可以停止进程,但当我关闭它并重新打开popup时,停止按钮不会将消息发送到background.js。这是我的代码,对不起,我是这方面的新手 backgrounds.js var interval; var repeater; var start, end; var completed = false; f
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);
}
});
});
var区间;
var中继器;
var开始、结束;
var completed=假;
函数更改页(新URL){
查询({currentWindow:true,active:true},函数(tab){
控制台日志(选项卡);
console.log(newUrl);
chrome.tabs.update(tab.id{
url:newUrl,
});
});
}
功能更新页面(数据){
让newUrl=data.url+alphanum[start];
如果(开始==结束){
完成=正确;
changePage(newUrl);
}否则{
changePage(newUrl);
}
//决定订单
if(data.start[0]e==msg.start);
end=alphanum.findIndex((e)=>e==msg.end);
console.log(开始、结束);
控制台日志(已完成);
控制台日志(msg);
(职能a(){
如果(!completed&&msg!=“stop”){
控制台日志(已完成);
更新页面(msg);
中继器=设置超时(a,消息超时);
}否则{
清除间隔(中继器);
}
})();
}否则如果(消息==“停止”){
完成=正确;
清除间隔(中继器);
}
});
});
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);
});
}
document.addEventListener(“DOMContentLoaded”,函数(){
document.getElementById(“开始”).addEventListener(“单击”,开始);
document.getElementById(“停止”).addEventListener(“单击”,停止);
});
var端口;
功能启动(事件){
event.preventDefault();
端口=chrome.runtime.connect({
名称:“开场白”,
});
让timeout=document.getElementById(“timeout”).value*1000;
让url=document.getElementById(“url”).value;
让start=document.getElementById(“st”)值;
让end=document.getElementById(“end”).value;
var good\u url\u regex=new RegExp(
/(^ |\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)(\/\s*))/gi
);
var字母数字字符串正则表达式=新正则表达式(/^[a-z0-9]+$/i);
if(url&&timeout&&start&&end){
if(url.match(good_url_regex)){
如果(
start.match(字母数字\字符串\正则表达式)&&
end.match(字母数字\字符串\正则表达式)
) {
如果(开始.length<2 | |结束.length<2){
警觉的(
“我是中间人,我是中间人,我是中间人。”
);
}否则{
postMessage({timeout,url,start,end});
port.onMessage.addListener(函数(msg){
console.log(“收到的消息:+msg”);
});
}
}否则{
警觉的(
“在中间休息时,我需要一份工作,我需要一份2-2份的工作。”
);
}
}否则{
警惕(“Helytelen weboldal.Kérlek ellenőrizd!”);
}
}否则{
警惕(“Kérlek tölts ki minden mezőt!”);
}
}
功能停止(事件){
event.preventDefault();
港口邮递信息(“停止”);
port.onMessage.addListener(函数(msg){
console.log(“收到的消息:+msg”);
});
}
我删除了一些对问题毫无意义的东西。附加信息,扩展名从aa到ZZ,您输入一个url,它在url末尾添加两个字符,并在延迟后打开。
如果我没有为这些东西使用正确的API,请帮助我找到正确的方法。我有点困在这里,不知道我做错了什么。使用
clearTimeout
而不是clearTimeout
。