Rails link_to和audio_tag

时间:2013-12-25 22:13:13

标签: ruby-on-rails-3 html5-audio link-to

当我在Rails中使用link_to标记时,我正试图找出在后台播放wav文件的最佳方法(类似HTML5)。

以下是我的一个观点中的示例link_to:

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

我想弄清楚当按下按钮时如何使用audio_tag来触发声音。我已经尝试将link_to ERB中的audio_tag组合在一起,但是会出现各种语法错误。

非常感谢任何例子。

更新01/04 / 14-10:18am CT:声音一次正确发射。但是,由于将link添加到link_to链接不再触发rails路径来更改对象,只播放声音

查看代码:

    <%= 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>

3 个答案:

答案 0 :(得分: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文件。

答案 1 :(得分:1)

我在这个答案中做了一些假设:

  1. 您正在使用HTML5标记
  2. 你想要一个风格化的链接&#34;按钮&#34;触发声音
  3. 您不想显示默认的HTML5音频播放器
  4. 声音文件存储在public/audios
  5. 声音文件已预先加载到页面上
  6. 不幸的是,audio_tag的Rails 3.2实现被破坏了(https://github.com/rails/rails/issues/9373)。因此,除非您使用Rails 4,否则最好使用实际的HTML标记。

    在此示例中,我们在默认的HTML5音频播放器中加载mp3文件。以下代码段应位于您的视图文件中。

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

    由于HTML5音频播放器附带&#34;内置&#34;显示chrome,你可能想用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进行细微更改,可以轻松扩展此示例以支持多个文件。

答案 2 :(得分:-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 ID添加到您的链接。