首页 > 解决方案 > 从 google chrome 扩展程序在后台运行音乐

问题描述

我正在制作一个 google chrome 扩展程序,您可以在其中按下某些按钮,它会启动、暂停或重新启动一首歌曲。我得到了它的工作,但有一个问题。当我关闭扩展程序时,歌曲停止了!我需要知道是否有办法解决这个问题。我研究了背景脚本和东西,但我无法让它们工作。请帮助,因为这是我的第一个 google chrome 扩展程序之一,我想了解更多信息。感谢您给我的任何帮助!

html: (popup.html)

<html>
<head>

<link rel="stylesheet" href="styles.css">
<script src="popup.js"></script>


</head>
<body>

<center>
<h1>Music Player</h1>
<h3>Songs:</h3>

<div id="ludicrous_speed">Ludicrous Speed 
<audio id="ludicrous" src="songs/ludicrous_speed.mp3" preload="auto"></audio>
<button class="Start" id="StartLudicrous">Start</button>
<button class="Pause" id="PauseLudicrous">Pause</button> 
<button class="Restart" id="RestartLudicrous">Restart</button>
</div>

</center>

</body>
</html>

Javascript:(popup.js)

function Start(song) {
song.play();
}

function Pause(song) {
song.pause();
}

function Restart(song) {
song.currentTime = 0;
}

document.addEventListener('DOMContentLoaded', function(){
var Start_Ludicrous = document.getElementById('StartLudicrous');
var Pause_Ludicrous = document.getElementById('PauseLudicrous');
var Restart_Ludicrous = document.getElementById('RestartLudicrous');

Start_Ludicrous.addEventListener('click', function() {
    Start(ludicrous);
});
Pause_Ludicrous.addEventListener('click', function() {
    Pause(ludicrous);
});
Restart_Ludicrous.addEventListener('click', function() {
    Restart(ludicrous);
});
});

CSS:(样式.css)

body {

width:300px;

}

.Start {
background-color: #42f46e;
border-color: #42f46e;
border-radius: 30%;
}

.Pause {
background-color: #f4e349;
border-color: #f4e349;
border-radius: 30%;
}

.Restart {
background-color: #e03838;
border-color: #e03838;
border-radius: 30%;
}

清单:(manifest.json)

{
"manifest_version":2,

"name":"Music Player",
"description":"Play Music",
"version":"1.0",

"browser_action":{
    "default_popup":"popup.html"
},

"permissions":[
    "activeTab"
]
}

标签: javascripthtmlgoogle-chrome-extension

解决方案


创建的文档只有在打开时才popup.html存在。

弹出窗口关闭的那一刻,<audio>元素不再存在。

背景页面提供了一个解决方案——它独立于弹出窗口而存在。

您通常不会自己创建背景页面的 HTML,只提供一堆脚本。但是没有什么能阻止你动态创建一个 DOM 节点:

// background.js
var audio_element = document.createElement("audio");
audio_element.src = "songs/ludicrous_speed.mp3";

audio_element.play();

现在,弹出窗口的代码将无法直接访问audio_element后台页面;您可以使用getBackgroundPage方法进行快速破解工作,但最好了解消息传递的工作原理并chrome.runtime.sendMessage从弹出窗口中使用来控制背景。


推荐阅读