将 JS 音量控件附加到多个 Audiojs 音频播放器
Attaching JS volume controls to multiple Audiojs audio players
我正在尝试为 audiojs 音频播放器创建音量滑块。我已成功创建滑块并将其绑定到音频播放器,但我的问题是它仅适用于播放器的第一个实例。我认为它需要某种循环来查找音频播放器的所有实例,但我在编写循环时遇到了问题。
我头标签中的javascript运行是:
audiojs.events.ready(function() {
var as = audiojs.createAll();
$('.slider').each(function() {
var slider = $('.slider'),
tooltip = $('.tooltip'),
audioList = document.getElementsByTagName("audio").length;
tooltip.hide();
slider.slider({
range: "min",
min: 0,
max: 100,
value: 50,
change: function(){
var value = $(".slider").slider("value");
for (var i = 0; i > audioList; i++) {
document.getElementById("player").volume = (value / 100);
};
},
start:function(event,ui) {
tooltip.fadeIn('fast');
},
slide: function(event, ui) {
var volume = $('.volume'),
value = $(".slider").slider("value");
document.getElementById("player").volume = (value / 100);
tooltip.css('left',value / 2).text(ui.value);
if(value <= 5) {
volume.css('background-position', '0 0');
}
else if (value <= 25) {
volume.css('background-position', '0 -25px');
}
else if (value <= 75) {
volume.css('background-position', '0 -50px');
}
else {
volume.css('background-position', '0 -75px');
};
},
stop:function(event,ui) {
tooltip.fadeOut('fast');
},
});
});
});
我需要一个兼容所有现代浏览器的解决方案。我在 github here 中有完整的文件。
我无法使用您的 audio.min.js
,但使用了来自 https://cdnjs.cloudflare.com/ajax/libs/audiojs/1.0.1/audio.js
的托管版本作为我的工作示例
我也无法在我的工作示例中使用您的图像。所以我希望这对你来说很容易适应你的个人代码。
工作示例:https://jsfiddle.net/Twisty/qx4Lzu9d/4/
HTML
<div id="audio">
<div class="audio-item">
<span class="podcast-type">Audio Summary</span>
<br />
<p><strong>Defining the Optimal Interval for Colonoscopic Screening in Individuals with a Family History of Colorectal Cancer</strong>
<br />
<em>By Matthew B. Yurgelun</em></p>
<audio id="player_1" src="https://traffic.libsyn.com/jcopodcast/Yurgelun.mp3" preload="auto"></audio><div id="vol_1" class="volume-button" data-level="50" data-min="0" data-max="100" data-player-id="1">Volume</div>
<span class="podcast-type">November 2, 2015</span>
<p><strong>Related Article:</strong> <a class="related" href="https://jco.ascopubs.org/content/early/2015/10/26/JCO.2015.62.2035" target="blank">Hennick et al</a></p>
</div>
<hr />
<div class="audio-item">
<span class="podcast-type">Art of Oncology</span>
<br />
<p><strong>The Emerging Role of Gallium-68 Somatostatin-Receptor PET Imaging in Neuroendocrine Tumors</strong>
<br />
<em>By Jonathan R. Strosberg</em></p>
<audio id="player_2" src="https://traffic.libsyn.com/jcopodcast/Strosberg.mp3" preload="auto"></audio><div id="vol_2" class="volume-button" data-player-id="2">Volume</div>
<span class="podcast-type">Decenber 28, 2015</span>
<p><strong>Related Article:</strong> <a class="related" href="https://jco.ascopubs.org/content/early/2015/12/24/JCO.2015.64.0987" target="blank">Sadowski et al</a></p>
</div>
</div>
在这里你可以看到我添加了一个 div
来为每个播放器创建一个音量按钮。我还解决了 id
问题。因此每个玩家都有一个唯一的 ID 和一个与之关联的音量按钮。
CSS
.audio-item .audiojs {
display: inline-block;
}
.section {
position: relative;
}
.volume-button {
height: 36px;
margin: 0;
margin-top: -28px;
}
.slide-wrapper {
background: #fff;
position: absolute;
width: 28px;
height: 120px;
border: 1px solid #333;
border-radius: 6px;
z-index: 100;
}
.slider {
position: absolute;
top: 12px;
left: 6px;
}
仅针对此示例进行少量修改。
jQuery
audiojs.events.ready(function() {
var as = audiojs.createAll();
});
$(function() {
$(".volume-button").button({
"icon": "ui-icon-volume-on",
"showLabel": false
}).click(function() {
if ($(".slide-wrapper").length) {
$(".slide-wrapper").remove();
return false;
}
var slideWrap = $("<div>", {
class: "slide-wrapper"
});
var vslide = $("<div>", {
class: "slider"
});
var pid = $(this).data("player-id");
var player = $("#player_" + pid)[0];
var lev = player.volume ? player.volume * 100 : 50;
console.log("Creating Volume Slider for #player_" + pid);
vslide.css("height", "100px");
vslide.slider({
orientation: "vertical",
range: "min",
min: 0,
max: 100,
value: lev,
slide: function(e, ui) {
console.log("Setting #player_" + pid + " volume to " +
ui.value);
player.volume = ui.value / 100;
},
stop: function(e, ui) {
slideWrap.remove();
}
});
slideWrap.append(vslide);
$(this).after(slideWrap);
slideWrap.position({
my: "left bottom",
at: "right bottom",
of: "#vol_" + pid
});
});
});
首先,我将 jQuery UI 项的加载与 AudioJS 分开。由于我们希望能够使用 audio
属性,因此最好在创建 UI 元素之前让它们先加载。
假设页面可能包含 1 个或多个 audio
元素,我们要为其创建音量按钮,我创建了一个广泛的初始化并使用 class 选择器。这些返回到按钮的 data-player-id
属性以了解要控制哪个播放器。此外,每个音量滑块都是动态创建的,并将从与其关联的播放器读取当前 volume
属性。
有条件地,我们会在单击按钮时删除任何现有的包装器及其滑块。
创建一个包装器 div
,可选,用于滑块。有助于定位和造型。
创建一个滑块div
,获取播放器 ID 和当前音量级别。然后初始化 UI Slider。为了好玩,我选择了垂直方向。由于 volume
属性需要介于 0 和 1 之间,因此我将最小值和最大值设置为 0 和 100,并将值设置为 audio.volume * 100
。这将确保我们在滑块上得到正确的表示。
在slide
上,我们调整值并将其传递给audio
元素:audio.volume = ui.value / 100;
在 stop
,我们删除了滑块。
它将附加在音量按钮之后并定位。
我正在尝试为 audiojs 音频播放器创建音量滑块。我已成功创建滑块并将其绑定到音频播放器,但我的问题是它仅适用于播放器的第一个实例。我认为它需要某种循环来查找音频播放器的所有实例,但我在编写循环时遇到了问题。
我头标签中的javascript运行是:
audiojs.events.ready(function() {
var as = audiojs.createAll();
$('.slider').each(function() {
var slider = $('.slider'),
tooltip = $('.tooltip'),
audioList = document.getElementsByTagName("audio").length;
tooltip.hide();
slider.slider({
range: "min",
min: 0,
max: 100,
value: 50,
change: function(){
var value = $(".slider").slider("value");
for (var i = 0; i > audioList; i++) {
document.getElementById("player").volume = (value / 100);
};
},
start:function(event,ui) {
tooltip.fadeIn('fast');
},
slide: function(event, ui) {
var volume = $('.volume'),
value = $(".slider").slider("value");
document.getElementById("player").volume = (value / 100);
tooltip.css('left',value / 2).text(ui.value);
if(value <= 5) {
volume.css('background-position', '0 0');
}
else if (value <= 25) {
volume.css('background-position', '0 -25px');
}
else if (value <= 75) {
volume.css('background-position', '0 -50px');
}
else {
volume.css('background-position', '0 -75px');
};
},
stop:function(event,ui) {
tooltip.fadeOut('fast');
},
});
});
});
我需要一个兼容所有现代浏览器的解决方案。我在 github here 中有完整的文件。
我无法使用您的 audio.min.js
,但使用了来自 https://cdnjs.cloudflare.com/ajax/libs/audiojs/1.0.1/audio.js
我也无法在我的工作示例中使用您的图像。所以我希望这对你来说很容易适应你的个人代码。
工作示例:https://jsfiddle.net/Twisty/qx4Lzu9d/4/
HTML
<div id="audio">
<div class="audio-item">
<span class="podcast-type">Audio Summary</span>
<br />
<p><strong>Defining the Optimal Interval for Colonoscopic Screening in Individuals with a Family History of Colorectal Cancer</strong>
<br />
<em>By Matthew B. Yurgelun</em></p>
<audio id="player_1" src="https://traffic.libsyn.com/jcopodcast/Yurgelun.mp3" preload="auto"></audio><div id="vol_1" class="volume-button" data-level="50" data-min="0" data-max="100" data-player-id="1">Volume</div>
<span class="podcast-type">November 2, 2015</span>
<p><strong>Related Article:</strong> <a class="related" href="https://jco.ascopubs.org/content/early/2015/10/26/JCO.2015.62.2035" target="blank">Hennick et al</a></p>
</div>
<hr />
<div class="audio-item">
<span class="podcast-type">Art of Oncology</span>
<br />
<p><strong>The Emerging Role of Gallium-68 Somatostatin-Receptor PET Imaging in Neuroendocrine Tumors</strong>
<br />
<em>By Jonathan R. Strosberg</em></p>
<audio id="player_2" src="https://traffic.libsyn.com/jcopodcast/Strosberg.mp3" preload="auto"></audio><div id="vol_2" class="volume-button" data-player-id="2">Volume</div>
<span class="podcast-type">Decenber 28, 2015</span>
<p><strong>Related Article:</strong> <a class="related" href="https://jco.ascopubs.org/content/early/2015/12/24/JCO.2015.64.0987" target="blank">Sadowski et al</a></p>
</div>
</div>
在这里你可以看到我添加了一个 div
来为每个播放器创建一个音量按钮。我还解决了 id
问题。因此每个玩家都有一个唯一的 ID 和一个与之关联的音量按钮。
CSS
.audio-item .audiojs {
display: inline-block;
}
.section {
position: relative;
}
.volume-button {
height: 36px;
margin: 0;
margin-top: -28px;
}
.slide-wrapper {
background: #fff;
position: absolute;
width: 28px;
height: 120px;
border: 1px solid #333;
border-radius: 6px;
z-index: 100;
}
.slider {
position: absolute;
top: 12px;
left: 6px;
}
仅针对此示例进行少量修改。
jQuery
audiojs.events.ready(function() {
var as = audiojs.createAll();
});
$(function() {
$(".volume-button").button({
"icon": "ui-icon-volume-on",
"showLabel": false
}).click(function() {
if ($(".slide-wrapper").length) {
$(".slide-wrapper").remove();
return false;
}
var slideWrap = $("<div>", {
class: "slide-wrapper"
});
var vslide = $("<div>", {
class: "slider"
});
var pid = $(this).data("player-id");
var player = $("#player_" + pid)[0];
var lev = player.volume ? player.volume * 100 : 50;
console.log("Creating Volume Slider for #player_" + pid);
vslide.css("height", "100px");
vslide.slider({
orientation: "vertical",
range: "min",
min: 0,
max: 100,
value: lev,
slide: function(e, ui) {
console.log("Setting #player_" + pid + " volume to " +
ui.value);
player.volume = ui.value / 100;
},
stop: function(e, ui) {
slideWrap.remove();
}
});
slideWrap.append(vslide);
$(this).after(slideWrap);
slideWrap.position({
my: "left bottom",
at: "right bottom",
of: "#vol_" + pid
});
});
});
首先,我将 jQuery UI 项的加载与 AudioJS 分开。由于我们希望能够使用 audio
属性,因此最好在创建 UI 元素之前让它们先加载。
假设页面可能包含 1 个或多个 audio
元素,我们要为其创建音量按钮,我创建了一个广泛的初始化并使用 class 选择器。这些返回到按钮的 data-player-id
属性以了解要控制哪个播放器。此外,每个音量滑块都是动态创建的,并将从与其关联的播放器读取当前 volume
属性。
有条件地,我们会在单击按钮时删除任何现有的包装器及其滑块。
创建一个包装器 div
,可选,用于滑块。有助于定位和造型。
创建一个滑块div
,获取播放器 ID 和当前音量级别。然后初始化 UI Slider。为了好玩,我选择了垂直方向。由于 volume
属性需要介于 0 和 1 之间,因此我将最小值和最大值设置为 0 和 100,并将值设置为 audio.volume * 100
。这将确保我们在滑块上得到正确的表示。
在slide
上,我们调整值并将其传递给audio
元素:audio.volume = ui.value / 100;
在 stop
,我们删除了滑块。
它将附加在音量按钮之后并定位。