Javascript 由于indexOf中的错误,if语句中的多个SendResponse无法运行

Javascript 由于indexOf中的错误,if语句中的多个SendResponse无法运行,javascript,html,google-chrome,google-chrome-extension,Javascript,Html,Google Chrome,Google Chrome Extension,在我的chrome扩展中,我有以下background.js作为我的后台脚本,它调用选项卡url,然后确定它是否安全 background.js 然后,popup.js将获得mypopup.html(如下)中的元素并显示结果 popup.html 身体{ 宽度:300px; } 这个网站安全吗? 0 可信站点 否 有害语言 0 然而,这并不正常。安装时,它可以正常工作,并显示https网站的“是”。然而,在第二次尝试中,我导航到一个http站点,仍然得到了YES的输出。第一次尝试后,反应似

在我的chrome扩展中,我有以下background.js作为我的后台脚本,它调用选项卡url,然后确定它是否安全

background.js 然后,popup.js将获得mypopup.html(如下)中的元素并显示结果

popup.html

身体{
宽度:300px;
}

这个网站安全吗?

0

可信站点

有害语言

0

然而,这并不正常。安装时,它可以正常工作,并显示https网站的“是”。然而,在第二次尝试中,我导航到一个http站点,仍然得到了YES的输出。第一次尝试后,反应似乎没有改变

检查控制台时,第一次尝试时会出现正确的
站点安全
响应。在第二次尝试中,
site secure
unsecure site
都出现,但前者先出现。这很可能就是为什么在第一次尝试导航到http网站时出现“是”而不是“否”。在第二次尝试导航到https网站时,它会给出正确的响应,但会出现错误的响应

此控制台图片显示给出的url和提供的响应。注意第一次的回答是正确的,但是第二次,两个回答都出现了,这是没有意义的。


似乎background.js中的if语句正在记住前面的结果或类似的内容。我对整个情况不太熟悉,很想听听我如何解决这个问题。

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

background.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;
});
var-url;
chrome.runtime.onInstalled.addListener(函数(){
console.log('loaded');
});
chrome.runtime.onMessage.addListener(函数(请求、发送方、发送响应){
chrome.tabs.query({'active':true,'lastFocusedWindow':true},函数(tabs){
url=选项卡[0]。url;
console.log(url);
if(url.indexOf('https')>=0){
console.log(“安全站点”);
log(url.indexOf('https');
sendResponse({security:“YES”});
}
else if(url.indexOf('https')<0){
console.log(“不安全站点”);
sendResponse({security:“NO”});
log(url.indexOf('https');
}
否则{
console.log('unable');
sendResponse({安全:“?”});
}
});
返回true;
});

除了下面的答案之外,您不需要背景页面,因为弹出窗口可以访问相同的API。因此问题是,每次发送消息时都会重复该过程。而且还必须同步执行?
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;
});
<!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>
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;
});