我有一个文字,想要点击它只播放句子。
<p class="sent hover 00 06">text 01</p>
<p class="sent hover 06 11">text 02</p>
<p class="sent hover 11 18">text 03</p>
<audio controls id="audioB"><source src="lev01/english.mp3" type="audio/mpeg"></audio>
JS
$(document).on("click", ".sent", function() {
var a=$(this).attr("class").split(" ")[2];
var b=$(this).attr("class").split(" ")[3];
//$("#audioB")[0].pause();
$("#audioB")[0].currentTime = a;
$("#audioB")[0].play();
$("#audioB")[0].addEventListener('timeupdate', function (){
if ($("#audioB")[0].currentTime >= b) {
$("#audioB")[0].pause();
}
}, false);
});
如果我点击任何一个句子,然后单击它之前的句子,它就有效。
但在反之亦然的情况下它不起作用,即如果我点击之前点击的句子之后的句子。
任何帮助?
答案 0 :(得分:1)
首先在 HTML 中将数据移动到用于保存数据的属性
<p class="sent hover" data-audiostart="00" data-audioend="06">text 01</p>
<p class="sent hover" data-audiostart="06" data-audioend="11">text 02</p>
<p class="sent hover" data-audiostart="11" data-audioend="18">text 03</p>
<audio controls id="audioB"><source src="lev01/english.mp3" type="audio/mpeg"></audio>
然后你需要在一个变量上创建一个闭包(例如end
),它保留了停止播放的时间......
例如,在<audio>
存在后,运行以下代码
// init
var playSegment = (function (audio) { // closure by IIFE
var end; // our variable
audio.addEventListener('timeupdate', function (e) { // handler to pause playback
if (this.currentTime >= end) {
this.pause();
}
});
return function (start_time, end_time) { // function to start playback
audio.currentTime = start_time;
end = end_time;
audio.play();
};
}(document.getElementById('audioB'))); // invoking IIFE with the <audio>
// usage
$(document).on('click', '.sent', function () {
playSegment(
parseFloat(this.dataset['audiostart']), // time lookups
parseFloat(this.dataset['audioend'])
);
});