由于indexOf中的错误,if 语句中的几个 sendReponse 不起作用



在我的chrome扩展程序中,我有以下背景.js作为我的后台脚本,它调用选项卡网址,然后确定它是否安全。

背景.js

chrome.runtime.onInstalled.addListener(function () {
console.log('loaded');
});
chrome.tabs.onUpdated.addListener(function () {
chrome.tabs.query({ 'active': true, 'lastFocusedWindow': true }, function (tabs) {
var url = tabs[0].url;
console.log(url);
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
if (url.indexOf('https') >= 0) {
console.log('secure site');
console.log(url.indexOf('https'));
sendResponse({ security: "YES" });
}
else if (url.indexOf('https') < 0) {
console.log('insecure site');
sendResponse({ security: "NO" });
console.log(url.indexOf('https'));
}
else {
console.log('unable');
sendResponse({ security: "?" });
}
}
)
})
});

我有一个来自弹出窗口的消息请求.js(如下(向后台发送消息.js。消息有一个侦听器,并根据 https 是否存在发送 YES 或 NO 的响应。

弹出窗口.js

chrome.runtime.sendMessage({ greeting: "hello" }, function (response) {
if (response.security == "YES") {
document.getElementById('webSecure').innerHTML = "YES";
}
else {
document.getElementById('webSecure').innerHTML = "NO";
}
//document.getElementById('webSecure').innerHTML = response.security;
});

然后,弹出窗口.js将获取我的弹出窗口中的元素.html(下图(并显示结果。

弹出窗口.html

<!DOCTYPE html>
<html lang="en">
<head>
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="material.css">
<script defer src="material.min.js"></script>
<link rel="stylesheet" href="styles.css">
<style>
body {
width: 300px;
}
</style>
</head>
<body>
<header>
<img src="logo_default256.png" id="logo" alt="logo-default">
<div class="options">
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="switch-2">
<input type="checkbox" id="switch-2" class="mdl-switch__input">
<span class="mdl-switch__label"></span>
</label>
<a href="settings.html">SETTINGS</a>
</div>
</header>
<hr>
<section>
<div class="content">
<h4>Is this website secure?</h4>
<p id="webSecure" class="result">0</p>
</div>
<div class="content">
<h4>Trusted Site</h4>
<!-- Accent-colored flat button -->
<p class="result">NO</p>
</div>
<div class="content">
<h4>Harmful Language</h4>
<p class="result">0</p>
</div>
</section>
<script src="popup.js"></script>
</body>
</html>

但是,这不能正常工作。安装时,它运行正常,并为 https 网站显示"是"。但是,在第二次尝试时,我导航到一个 http 站点,但仍然得到 YES 的输出。似乎响应与第一次尝试相比没有改变。

检查控制台时,第一次尝试时会显示正确的site secure响应。在第二次尝试中,site secureinsecure site都出现,但前者首先出现。这很可能就是为什么出现"是"而不是"否"的原因。当第一次尝试导航到 http 网站时,同样的事情会发生,它在第二次尝试导航到 https 网站时给出正确的响应但错误的响应。

此控制台图片显示了给定的 URL 和提供的响应。请注意,第一个响应是正确的,但第二次,两个响应都存在,这没有意义。 安慰

似乎后台的 if 语句.js正在记住之前的结果或类似的东西。我不熟悉完整的情况,很想听听如何解决这个问题。

每次更新选项卡时都会添加一个消息侦听器,这就是有多个响应的原因。试试这个:

背景.js

var url;
chrome.runtime.onInstalled.addListener(function () {
console.log('loaded');
});
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
chrome.tabs.query({ 'active': true, 'lastFocusedWindow': true }, function (tabs) {
url = tabs[0].url;
console.log(url);
if (url.indexOf('https') >= 0) {
console.log('secure site');
console.log(url.indexOf('https'));
sendResponse({ security: "YES" });
}
else if (url.indexOf('https') < 0) {
console.log('insecure site');
sendResponse({ security: "NO" });
console.log(url.indexOf('https'));
}
else {
console.log('unable');
sendResponse({ security: "?" });
}
});
return true;
});

最新更新