2013-11-26 1 views
1

Учитывая п разных слов:JS/JQuery текст в речь: как подключить аудио?

var text = [ "bèijing Beijing Shanghai"] 
var words= [ "bèijing", "Beijing", "Shanghai" ]; 

Учитывая п различных .OGG аудио файлов с известными местами:

<!-- AUDIOS FILES --> 
<audio id="id1" src="/audio/Zh-bèijing.ogg"></audio> 
<audio id="id2" src="/audio/Zh-Beijing.ogg"></audio> 
<audio id="id3" src="/audio/Zh-Shanghai.ogg"></audio> 

я использую JS getElementById('...').play(), что я бег, используя onclick событие злоумышленника HTML элемента:

<!-- HTML --> 
<div id="play" onClick="document.getElementById('id1').play();"> 
    <button>Play</button> 
</div> 

Это позволяет мне воспроизводить один аудиофайл.

Использование одного однократного события onlick, как воспроизвести первый звук, а затем, когда он будет сделан цепочкой для воспроизведения второго звука?

Начиная фидель с активами там: http://jsfiddle.net/J9wAB/

Примечание: Я попытался document.getElementById('id1').play().done(document.getElementById('id2').play()), но он одновременно играет оба файла.

EDIT: Я принял один ответ, работающий над Firefox. Тем не менее, этот ответ на addEventListener не работает в некоторых браузерах. Альтернативный альтернативный вариант ответа может быть более успешным.

+0

См. Также http://stackoverflow.com/a/7198851/1974961 – Hugolpz

+0

Действительно ли ваш вызов 'play()' действительно возвращает обещание (которое имеет метод '.done()')? – Bergi

ответ

4

Что-то вроде этого:

$('#play').data('audio', $('audio:first')).on('click', function() { 
    var self = this; 
    $(this).data('audio').on('ended', function() { 
     var n = $('audio').eq($(self).data('audio').index('audio') + 1); 
     $(self).data('audio', n.length ? n : $('audio:first')); 
    }).get(0).play(); 
}); 

FIDDLE

Он получает первый звуковой элемент в документе, и сохраняет его в данных JQuery, и когда он играл (в onended событие), то получить это следующий аудио-элемент в DOM, и в следующий раз, когда нажимается кнопка, он воспроизводит это, и когда нет более звуковых элементов, оно начинается с начала снова.

Если вы действительно wan't использовать ID вместо этого, было бы что-то вроде:

var audio = 1 

$('#play').on('click', function() { 
    $('#id' + audio).get(0).play(); 
    audio++; 
}); 

FIDDLE

Чтобы играть все три на один клик, один за другим, вы» d сделать

$('#play').on('click', function() { 
    $('audio').on('ended', function() { 
     $('audio').eq($(this).index('audio')+1).get(0).play(); 
    }).get(0).play(); 
}); 

FIDDLE

+0

спасибо за этот толчок. Я, однако, желаю «подключить» эти аудио, что означает, что я хочу, чтобы один клик читал их 3 один за другим. (Я признаю, что это непросто объяснить). Я ответил вам, чтобы вы уже поблагодарили. – Hugolpz

+0

@ Hugolpz - должно быть довольно легко, добавлено в ответ! – adeneo

+0

Совершает ли скрипка n⁰14 3 звука в вашем браузере? Он просто играет первым в Chrome, но я готов отблагодарить ваш ответ, если он работает в вашем браузере. – Hugolpz

1

Вы можете использовать onended="yourcallback()", чтобы начать следующий звук.

Посмотрите на этот ответ, пожалуйста: https://stackoverflow.com/a/7652194/2707424

+0

не могли бы вы быть более точными для новичка вроде меня. – Hugolpz

1

Нет Jquery не нужно, просто слушать для закончился событие

Простой случай заключается в следующем:

document.getElementById('id1').addEventListener('ended', function(){ 
    document.getElementById('id2').play(); 
}); 

реферировать, это будет выглядеть например http://jsfiddle.net/J9wAB/13/

function chain(ids/* id, id, ... */) { 
    function setHandler(first, next) { 
     document.getElementById(first).addEventListener('ended', function(){ 
     document.getElementById(next).play(); 
     }); 
    } 
    for (var i = 0; i < arguments.length - 1; i++) { 
     setHandler(arguments[i], arguments[i+1]); 
    } 
} 
chain('id1', 'id2', 'id3'); 
+0

Работает на Firefox! 1 клик => 3 аудиофайла, играемого в качестве предложения! Chrome разбил его. Но спасибо вам :) – Hugolpz

+0

Это не сбой на моем Chrome –

+0

Просто обновлен до Chromium 'Version 30.0.1599.114 Ubuntu 13.04 (30.0.1599.114-0ubuntu0.13.04.2)', все еще не удается. – Hugolpz