#javascript #jquery #audio
#javascript #jquery #Аудио
Вопрос:
У меня есть несколько кнопок воспроизведения звука. Я хотел бы приостановить все остальные, когда я нажимаю на один из них. это работает нормально, но дополнительно я хотел бы приостановить текущий и запустить другой напрямую.
var playing = false;
jQuery('.player').click(function() {
jQuery('.player').removeClass('playing');
jQuery(this).addClass('playing');
jQuery('.playing').each(function(){
var audio = jQuery(this).find('audio')[0];
if (playing !== true) {
audio.play();
} else {
audio.pause();
audio.currentTime = 0;
}
playing = !playing
jQuery(this).siblings().find('audio').each(function(index, elem){
elem.pause();
elem.currentTime = 0;
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="player" >
<h2>Fractions du Silence</h2>
<audio class="sound">
<source>
<a href="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Fractions-du-silence-Bertrand-Dubedout.mp3">Fractions du silence</a>
</source>
</audio>
</div>
<div class="player">
<h2>Merlin, 1. Movement</h2>
<audio class="sound">
<source><a href="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Merlin-1.-Movement-Andrew-Thomas.mp3">Merlin, 1. Movement (Andrew Thomas)</a>
</source>
</audio>
</div>
Комментарии:
1. Что вы имеете в виду здесь «я хотел бы приостановить текущий и запустить другой напрямую». говоря напрямую, вы имеете в виду, например, приостановить один звук, включить другой звук и нажать play?
2. Привет, Мосия, я имею в виду, что первый щелчок -> воспроизведение текущего и приостановка всех остальных, второй щелчок по той же кнопке -> последующая пауза, нажмите другую кнопку-> приостановить первую, приостановить все остальные и воспроизвести это. На данный момент мне нужно два клика
3. другими словами … дополнительно, чтобы воспроизвести текущий и приостановить все остальные, я хочу, чтобы, если воспроизводится первый, и я нажимаю вторую кнопку, первый должен приостановиться, а второй должен воспроизводиться
4. Я понимаю, круто, дай мне это проверить.
Ответ №1:
$(document).on('click', '.player', function() {
let players = $(document).find('.player');
$.each(players, function(i, val) {
if ($(this).data('id') !== $(val).data('id')) {
if ($(val).data('playing')) {
$(val).data('playing', false);
let audio = $(val).find('audio').get(0);
audio.pause;
audio.currentTime = 0;
}
} else {
if ($(val).data('playing')) {
$(val).data('playing', false);
let audio = $(val).find('audio').get(0);
audio.pause;
audio.currentTime = 0;
} else {
$(val).data('playing', true);
let audio = $(val).find('audio').get(0);
audio.play;
}
}
})
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="player" data-playing="false" data-id="1">
<h2>Fractions du Silence</h2>
<audio class="sound" preload="auto">
<source src="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Fractions-du-silence-Bertrand-Dubedout.mp3">Fractions du silence</source></audio>
</div>
<div class="player" data-playing="false" data-id="2">
<h2>Merlin, 1. Movement</h2>
<audio class="sound" preload="auto">
<source src="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Merlin-1.-Movement-Andrew-Thomas.mp3">Merlin, 1. Movement (Andrew Thomas)</source></audio>
</div>
На самом деле я сделал это сам, но с видео вместо аудио. Принцип тот же.
<div class="player" ><h2>Fractions du Silence</h2>
<audio class="sound">
<source><a href="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Fractions-du-silence-Bertrand-Dubedout.mp3">Fractions du silence</a></source>
</audio>
</div>
<div class="player">
<h2>Merlin, 1. Movement</h2>
<audio class="sound">
<source><a href="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Merlin-1.-Movement-Andrew-Thomas.mp3">Merlin, 1. Movement (Andrew Thomas)</a></source> </audio>
</div>
Выше приведен имеющийся у вас код, под ним я напишу, как я это сделал.
<div class="player" data-playing="false" data-id="1">
<h2>Fractions du Silence</h2>
<audio class="sound">
<source src="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Fractions-du-silence-Bertrand-Dubedout.mp3">Fractions du silence</source>
</audio>
</div>
<div class="player" data-playing="false" data-id="2">
<h2>Merlin, 1. Movement</h2>
<audio class="sound">
<source src="http://localhost:8888/sabrinama.com/wp-content/uploads/2020/08/Merlin-1.-Movement-Andrew-Thomas.mp3">Merlin, 1. Movement (Andrew Thomas)</source> </audio>
</div>
Я применил атрибуты данных к html, поэтому они будут отдельными объектами, не полагаясь на глобальную переменную в js, и в js вы можете увидеть, почему я это сделал.
var playing = false;
jQuery('.player').click(function() {
jQuery('.player').removeClass('playing');
jQuery(this).addClass('playing');
jQuery('.playing').each(function(){
var audio = jQuery(this).find('audio')[0];
if (playing !== true) {
audio.play();
} else {
audio.pause();
audio.currentTime = 0;
}
playing = !playing
jQuery(this).siblings().find('audio').each(function(index, elem){
elem.pause();
elem.currentTime = 0;
});
});
});
Я уже писал, что с атрибутами данных вам не понадобится глобальная переменная, которая воспроизводится у вас.
$(document).on('click', '.player', function(){
let players = $(document).find('.player');
$.each(players, function(i, val){
if($(this).data('id')!== $(val).data('id')){
$(val).data('playing', false);
let audio = $(val).find('audio').get(0);
audio.pause;
audio.currentTime=0;
} else {
$(val).data('playing', true);
let audio = $(val).find('audio').get(0);
audio.play;
}
})
})
Как я сделал с вашим html-кодом. Я внес некоторые изменения в js. Во-первых, я полностью удалил выполняемые вами вызовы jQuery, все они заменены на $, что является тем же самым.
После этого я создал документ события на () вместо .player click(). Это позволит в будущем, когда вы захотите добавлять больше вещей динамически.
После этого я собрал всех проигрывателей в let, и с каждым циклом вы можете что-то делать с каждым из них. В этом случае я проверяю, совпадает ли идентификатор данных с идентификатором выбранного проигрывателя. Если значение false, приостановите его и установите time равным 0, если true, воспроизведите звук.
Если вы хотите, вы можете добавить в if, который проверит, воспроизводится ли проигрыватель, поместив вы можете поместить следующие if и ifelse
if($(val).data('playing'))
{
$(val).data('playing', false);
let audio = $(val).find('audio').get(0);
audio.pause;
audio.currentTime=0;
} else {
$(val).data('playing', true);
let audio = $(val).find('audio').get(0);
audio.play;
}
Это if else можно использовать, когда вы нажимаете на проигрыватель, который уже воспроизводится, для нажатия на другой проигрыватель после паузы вам просто нужна часть if.
Редактировать: я видел, что в html вы использовали тег a, это не требуется при работе с аудио и видео, его <source src="location of file">
Правка 2: я попытался с помощью фрагмента кода заставить его работать или, по крайней мере, без ошибок. Звук не будет воспроизводиться из-за localhost.
Комментарии:
1. большое вам спасибо. Я пробовал это, но не могу заставить это работать. На данный момент он ничего не воспроизводит.
2. @Benedikt Я скоро обновлю свой ответ, потому что я вижу кое-что, что я пропустил раньше
3. @benedikt Я внес обновление. На этот раз в нем нет ошибок, но он не будет воспроизводиться, потому что нет музыки для поиска. Вам нужно будет протестировать это в вашем собственном коде.
4. еще раз спасибо за ваше время и ваши идеи. Я пробовал это, как вы сказали, но я не могу заставить это работать.