2013-12-25 5 views
5

Я пытаюсь найти лучший способ воспроизвести wav-файл в фоновом режиме (HTML5-подобный), когда я использую тег link_to в Rails.Rails link_to и audio_tag

Вот пример link_to от одного из моих взглядов:

<%= link_to 'At Station', at_station_mdt_index_path, :class => 'btn btn-success btn-medium', :method => :put, :remote => true %> 

Я хотел бы, чтобы выяснить, как использовать audio_tag, чтобы вызвать звук при нажатии кнопки. Я попытался объединить audio_tag в link_to ERB, но получить всевозможные синтаксические ошибки.

Любые примеры были бы весьма признательны.

Обновлено 01/04/14-10: 18am CT: Звуки срабатывают один раз и правильно. Однако, так как добавление: идентификатор в link_to ссылки больше не вызывают путь рельсы, чтобы изменить объект, только воспроизводит звук

Просмотр кода:

<%= link_to 'En Route', en_route_mdt_index_path(:call_id => call.id), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true, :id => "er" %> 
      <%= link_to 'On Scene', on_scene_mdt_index_path(:call_id => call.id), :id => 'to', :class => 'btn btn-primary btn-medium', :method => :put, :remote => true, :id => "os" %> 
      <%= link_to 'To Hospital', to_hospital_mdt_index_path(:call_id => call.id), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true, :id => "to" %> 

<audio id="en-route" class="audio_player" preload="true"> 
    <source src="audios/en-route.wav" type="audio/wav"> 
</audio> 

<audio id="on-scene" class="audio_player" preload="true"> 
    <source src="audios/on-scene.wav" type="audio/wav"> 
</audio> 

<audio id="to-hospital" class="audio_player" preload="true"> 
    <source src="audios/to-hospital.wav" type="audio/wav"> 
</audio> 

<script> 
$('#er').click(function (e) { 
    e.preventDefault(); 
    $('#en-route')[0].currentTime = 0; 
    $('#en-route')[0].play(); 
    return true; 

}); 

$('#os').click(function (e) { 
    e.preventDefault(); 
    $('#on-scene')[0].currentTime = 0; 
    $('#on-scene')[0].play(); 
    return true; 

}); 

$('#to').click(function (e) { 
    e.preventDefault(); 
    $('#to-hospital')[0].currentTime = 0; 
    $('#to-hospital')[0].play(); 
    return true; 

}); 
</script> 

ответ

5

Вот простой пример для воспроизведения WAV-файл:

http://jsfiddle.net/84pav/

HTML:

<a href="javascript:void(0)" id="playsound">At Station</a> 

<audio id="sound_effect" class="audio_player" preload="auto"> 
    <source src="http://www.villagegeek.com/downloads/webwavs/alrighty.wav" type="audio/wav"> 
</audio> 

JavaScript:

$('#playsound').click(function (e) { 
    $('#sound_effect')[0].currentTime = 0; 
    $('#sound_effect')[0].play(); 
    return false; 
}); 

Я поставил currentTime = 0 перед игрой, чтобы сделать его всегда играет с самого начала.

Это не работает на IE, потому что IE не поддерживает wav-файл.

+0

Это действительно работает. Однако после того, как мои частичные обновления обновляются через Javascript, ссылка больше не работает. Он будет работать только после перезагрузки всей страницы. Моя функция JS обновляет частичные значения каждые 10 секунд, чтобы вытащить новые данные, так как это приводит к тому, что звуковой тег не загружается. Только на странице обновления. – nulltek

+0

В вашем вопросе вы получили сообщение об ошибке application.js. Это означает, что вы поместите свой скрипт в один из файлов js в активах. И я предполагаю, что вы загрузите application.js в макет. При частичной перезагрузке элементы DOM заменяются. Событие click необходимо связать снова с новыми элементами DOM. Но ваш скрипт загружается только один раз, поэтому он не работает. Есть два способа исправить это: (1) поместить скрипт в частичное, чтобы он перезапускался каждый раз при повторной загрузке страницы, или (2) после перезагрузки страницы вы вызываете функцию для привязки событий сам. –

+0

Я попытался переместить аудио-элемент и javascript в частичный. Даже с соответствующими идентификационными элементами, дифференцирующими две ссылки, любая ссылка на странице вызывает оба звука. Также, когда javascript index.html.erb перезагружается каждые 10 секунд, он одновременно воспроизводит оба звука. Я вставил свой текущий код, чтобы вы могли посмотреть. – nulltek

-1

Как о чем-то вроде этого ...

function playSound(soundfile) { 
    document.getElementById("playsound").innerHTML= 
    "<embed src=\""+soundfile+"\" hidden=\"true\" autostart=\"true\" loop=\"false\" />"; 
} 

$('#playsound').observe('click', function (event) { 
    playSound('URL to soundfile'); 
    event.stop(); // Prevent link from following through to its given href 
}); 

Затем добавьте к вашей ссылке playsound.

+0

Спасибо за JS. Я пробовал это, но я получаю Uncaught TypeError: Object [object Object] не имеет метода «наблюдать» в консоли браузера, и он не запускает soundbyte. Я обновил свой код, чтобы отразить ваши предложения в случае неправильного синтаксиса. – nulltek

+0

Я не смог попробовать его локально, примером в первую очередь является демонстрация концепции, вам, возможно, придется немного подправить ее, чтобы работать на вас. – Donovan

+0

Я работаю над этим, но я новичок JS/jQuery. Мне нужно найти еще несколько примеров, чтобы лучше понять их и заставить что-то работать. Вытащить волосы lol – nulltek

1

Я делаю несколько предположений в этом ответе:

  1. Вы используете HTML5 разметку
  2. Вы хотите стилизованную ссылку «кнопку», чтобы вызвать звук,
  3. Вы не хотите для отображения по умолчанию HTML5 аудиоплеер в
  4. звуковые файлы хранятся в public/audios
  5. звуковой файл с предварительно загруженным на странице

К сожалению, исправлена ​​ошибка в Rails 3.2: audio_tag (https://github.com/rails/rails/issues/9373). Поэтому, если вы не используете Rails 4, вам лучше использовать фактическую разметку HTML.

В этом примере мы загружаем mp3-файл в аудиоплеер HTML5 по умолчанию. Следующий фрагмент должен быть в вашем файле вида.

<audio id="sound_effect" class="audio_player" controls="false" preload="true"> 
    <source src="/audios/TrainWhistle.mp3" type="audio/mpeg"> 
</audio> 

Поскольку аудиоплеер HTML5 поставляется с «встроенной» дисплей хром, вы можете поместить его на страницу с помощью CSS. В этом примере, необходимо добавить следующие строки в файл CSS:

.audio_player { 
    position: absolute; 
    top: -999em; 
{ 

Ваша разметка link_to будет выглядеть примерно так:

<%= link_to 'At Station', '#', class: 'btn btn-success btn-medium', id: 'playsound' %> 

Код JavaScript на самом деле воспроизводить звук будет выглядеть как на примере JQuery :

$('#playsound').on('click', function (e) { 
    e.preventDefault(); 
    $('#sound_effect').currentTime = 0; 
    $('#sound_effect').play(); 
    return false; 
}); 

Этот пример может быть легко расширен для поддержки нескольких файлов с помощью небольших изменений в link_to теги и JavaScript.

+0

Спасибо, это правильный трек. Я отредактировал код, чтобы отразить мои настройки (я использую wav-файлы в каталоге public/audios). CSS действительно скрывает аудиоплеер, который хорош. Я отключил его, чтобы увидеть, что происходит, когда я нажимаю на ссылку, чтобы он ничего не играл. Он просто быстро проскакивает через файл. Есть предположения ? Я отредактировал ваш пример кода выше, чтобы отразить мою конфигурацию. – nulltek

+0

Когда я показываю класс audio_player и пытаюсь играть, ничего не происходит. Он просто быстро пропускает файл. Кроме того, у тома есть значок с косой чертой, независимо от того, разрешаю ли я элементы управления. Я использую хром btw. Хотя эта функция будет предназначена для iOS Safari. – nulltek

+0

Можете ли вы опубликовать ссылку? Может помочь с отладкой. – jrmyward