1

我正在使用Chrome扩展,它将浏览器操作图标更改为“red.png”或“green.png”(它们都保存在同一个目录中作为所有其他文件),当浏览器应用程序检测到从html5标签播放声音时。Chrome扩展:扩展无法正常工作 - 内容脚本与后台脚本通信

我的逻辑思维过程是:用户打开页面,脚本开始在不断运行的页面上运行(也许一个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扩展开发以及JavaScript(尽管不一定是编程新手)都很新颖。

此外,如果你可以想到其他方式(更好)来完成相同的任务,请让我知道。

任何输入将不胜感激!谢谢!

回答

1

UPDATE:

此外,表述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功能”

chagne以上到:
setInterval(sendInfo, 500);


顺便说一句,chrome.extension.sendRequest/onRequest已过时,应与chrome.runtime.sendMessage/onMessage代替被替换。
除了过时之外,前者在发送消息之前没有正确地加载事件页面(又名非持续性背景页面),所以这可能是你的问题的原因。

+0

将编辑这部分,谢谢,虽然仍然无法正常工作,我不知道从哪里开始寻找错误。 – AndrewB

+1

@AndrewB:请查看我的更新答案,以了解更多可能的错误原因(并让我知道它是否解决了问题)。如果问题仍然存在,请尝试在后台页面的控制台日志以及正在注入内容脚本的网页中查找任何错误。 – gkalpak

+0

你好,只是更新了我在原帖中使用的代码。 它仍然不起作用(如果它正在工作,图像将从红色变为绿色,这种情况不会发生)。 它正在测试的页面是我自己制作的最小页面,带有两个音频标签和一个h1标签,其中一个音频标签的ID为“myAudio”。 感谢您的耐心等待,我很忙,所以回到您身边,测试它有时需要时间! – AndrewB

相关问题