Chrome扩展程序:扩展程序无效 - 内容脚本与后台脚本通信

时间:2013-11-23 23:02:53

标签: google-chrome javascript-events google-chrome-extension background content-script

我正在使用Chrome扩展程序,当浏览器应用程序检测到声音时,它会将浏览器操作图标更改为“red.png”或“green.png”(它们都保存在与所有其他文件相同的目录中)从html5标签播放。

我的逻辑思维过程是:用户打开页面,脚本开始在页面上运行,不断(可能是setInterval())检查声音是否正在运行。如果声音正在运行,请将图标更改为“green.png”,否则将其设置为“red.png”。

我正在检查声音是否正在播放的方式是:

 if (audio.duration > 0 && !audio.paused)

音频是包含元素的变量。

这是我的代码:

    manifest.json file:

{
    "name": "Creative Sound Dedection",
    "description": "Creatively detects sound.",
    "version": "1.0",

    "permissions": [
        "activeTab"
    ],

    "background": {
        "scripts": ["background.js"],
        "persistent": false
    },

    "browser_action": {
        "default_icon": "red.png"
    },

    "content_scripts" : [
        {
            "matches" : [ "<all_urls>" ],
            "js" : [ "myscript.js" ]
        }
    ],

    "manifest_version": 2
}

background.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
    var playing = request.playing;

    if(playing == true)
    {
        chrome.browserAction.setIcon({path:"green.png"});
    }else{
        chrome.browserAction.setIcon({path:"red.png"});
    }
});

myscript.js

function isAudioPlaying(var audio)
{
    if (audio !== false && audio.duration > 0 && !audio.paused)
    {
        return true;
    }

    return false;
}

function getAudio()
{
    if(document.getElementById("myAudio")) return document.getElementById("myAudio");

    return false;
}

//if audio is playing: tell background that audio is playing, otherwise, tell it audio is not playing
function sendInfo()
{
    chrome.runtime.sendMessage({
        "playing": true
    });
}

document.addEventListener('DOMContentLoaded', function () {
    setInterval(sendInfo, 500);
});

我正在寻找帮助,说明为什么这不起作用以及如何纠正它,我对Chrome Extensions开发以及javascript(虽然不一定是编程新手)都很陌生。

另外,如果你能想到其他方法(更好)来完成同样的任务,请告诉我。

任何输入都将非常感谢!谢谢!

1 个答案:

答案 0 :(得分:1)

<强>更新

此外,表达式playing == true将始终评估为false,因为playing是一个字符串。所以:

// Change that:
var playing = request.playing;
if (playing == true) {...

// To this:
var playing = request.playing;
if (playing == "true") {...

setInterval(sendInfo(), 500);表示:
“每500毫秒,执行 sendInfo()返回的值。”

既然你想说:
“每500毫秒,执行名为
sendInfo函数。”

将上述内容归为:
setInterval(sendInfo, 500);


BTW, chrome.extension.sendRequest/onRequest 已过时,应替换为 chrome.runtime.sendMessage / onMessage
除了过时之外,前者在发送消息之前没有正确加载事件页面(例如非持久性后台页面),因此这可能是导致问题的原因。