【发布时间】:2020-02-23 18:54:56
【问题描述】:
在我短暂的程序员生涯中,我第一次看到这样的行为:
一个扩展在它自己的作品中像我预期的那样工作,但是如果我将一些变量拉入控制台,我意识到它们会被多次加载(三、四和五次,取决于console.log 在@987654322 中的位置@)。这是它们的列表 - 也可以在 background.js 中看到:
console.log("domen: "+currentDomain);console.log("language/countrysubdomen: "+savedApi);console.log("index: "+badgeText);
有什么可以忽略的吗?应该避免吗?如何?这些变量被加载到文件中,该文件有 60 行长——我曾多次浏览该文件,但没有发现多次加载的原因。
为什么会这样? background.js 中有什么错误以及如何改进以解决此问题?
清单
{
"name": " App",
"description": "",
"version": "1.0",
"background": {
"scripts": [
"background.js",
"psl.js"
],
"persistent": false
},
"options_page": "options.html",
"options_ui": {
"page": "options.html",
"chrome_style": true,
"open_in_tab": false
},
"permissions": [
"webNavigation",
"activeTab",
"tabs",
"http://*/*",
"https://*/*",
"storage",
"background"
],
"browser_action": {
"default_title": "metrics",
"default_icon": {
"19": "icon19.png",
"38": "icon38.png"
},
"default_popup": "popup.html"
},
"icons": {
"16": "icon16.png",
"19": "icon19.png",
"24": "icon24.png",
"32": "icon32.png",
"38": "icon38.png",
"48": "icon48.png",
"128": "icon128.png"
},
"web_accessible_resources": [
"welcome.html"
],
"manifest_version": 2
}
背景
var currentDomain = "";
var currentHost = "";
var currentFullpath = "";
var currentUrl = "";
var currentFolder = "";
var badgeText = "";
chrome.runtime.onInstalled.addListener(function (object) {
if (chrome.runtime.OnInstalledReason.INSTALL === object.reason) {
chrome.tabs.create({ url: chrome.extension.getURL("welcome.html") }, function (tab) {
console.log("New tab launched with instructions to use the extension");
});
}
});
chrome.tabs.onUpdated.addListener(function (tabid, changeInfo, tab) {
chrome.tabs.query({ 'active': true, 'currentWindow': true }, function (tabs) {
let newUrl = new URL(tabs[0].url);
currentHost = newUrl.host;
currentUrl = tabs[0].url;
currentFullpath = currentUrl.substring(0, currentUrl.lastIndexOf("/"));
currentFolder = currentUrl.split("/");
parsed = psl.parse(currentHost);
currentDomain = parsed.domain;
console.log("domen: " + currentDomain);
chrome.storage.sync.get('savedApi', ({ savedApi }) => {
console.log("language/countrysubdomen: " + savedApi);
if (savedApi == null)
savedApi = 'de';
if (currentDomain == null)
return false;
var xhr = new XMLHttpRequest();
var protocol = "https://";
var middle = ".myservice.com/seo/__loadModule/domain/"
var end = "/mobile/1/_action/_data_visindex_normal/";
xhr.open("GET", protocol + savedApi + middle + currentDomain + end, true);
xhr.responseType = 'document';
xhr.send();
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
function getElementByXpath(path) {
return xhr.response.evaluate(path, xhr.response, null, XPathResult.STRING_TYPE, null).stringValue;
}
badgeText = getElementByXpath("normalize-space(//div[@class='data']/span[@class='value']/text())");
console.log("index: " + badgeText);
chrome.browserAction.setTitle({ title: "The number of " + currentDomain + " is " + String(badgeText) });
chrome.browserAction.setBadgeText({ text: String(badgeText) });
chrome.browserAction.setBadgeBackgroundColor({ color: '#1d2554' });
};
};
});
});
});
【问题讨论】:
-
请编辑您的问题以将所有相关代码内联。人们将不愿关注谷歌驱动器链接。
-
真的吗?你能解释一下这种不情愿吗?你的意思是还有另一个文件托管商,人们不情愿吗? 120行代码不是什么东西,是什么让帖子不可读?
-
我懒得关注所有的外链,这里的内联代码是放在滚动容器里的,所以没问题。
-
@MaxLemieux 很好,它们不再是外部的——关于主题有什么要说的吗?
-
Chrome.tabs.onUpdated.addListener 可能会在复杂页面加载期间发生的重复“正在加载/已加载”状态更改时触发。
标签: javascript google-chrome-extension