javascript - 创建 <audio> 元素,然后在单击表格单元格时播放

标签 javascript jquery html closures

我有一个包含许多单元格的 HTML 表格,我想给每个单元格一个类或 ID,以便可以播放相应的声音。由于有很多单元格,我想使用 Javascript+jQuery 自动执行此任务,并减少 HTML 的困惑。

假设我有一个包含文本 a 的单元格.我想将该单元格的类设置为 click_sound_a并生成 <audio> ID 为 sound_a 的标签将播放声音 a.mp3 . (我也可以为单元格使用 ID,但我想我会有一些重复。)

我以下面的代码为例,有 5 个声音:

<script type="text/Javascript">
 // trigger play event on an audio element
function playSound(sound) {
    $("#sound_"+sound).get(0).play();
}

$(document).ready(function() {
    var sounds = ["a", "i", "u", "e", "o"];

    // create HTML5 <audio> elements
    for (var i in sounds) {
        $("<audio id='sound_"+sounds[i]+"'>  <source src='/downloads/sounds/"+sounds[i]+".mp3' type='audio/mpeg'> </audio>").appendTo("#page");

        // make columns clickable to play sounds
        $(".click_sound_"+sounds[i]).click(function() {
            playSound(sounds[i]);
        });
    } // end for
});
</script>

问题在于,当循环终止时,所有单元格都会收到最后一个元素的声音,即使它们已被分配到正确的类别。所以在这种情况下,每个单元格都会播放 o.mp3 .错误在哪里?

最佳答案

<script type="text/Javascript">
 // trigger play event on an audio element
function playSound(sound) {
  return function() {
    $("#sound_"+sound).get(0).play();
  }
}

$(document).ready(function() {
    var sounds = ["a", "i", "u", "e", "o"];

    // create HTML5 <audio> elements
    for (var i in sounds) {
        $("<audio id='sound_"+sounds[i]+"'>  <source src='/downloads/sounds/"+sounds[i]+".mp3' type='audio/mpeg'> </audio>").appendTo("#page");

        // make columns clickable to play sounds
        $(".click_sound_"+sounds[i]).click(playSound(sounds[i]));
    } // end for
});
</script>

说明:这是一个典型的 JavaScript 陷阱。每当调用您定义的事件处理程序时,它都会查找最后更新为 4 的 i 变量的值。您需要使用闭包将适当的值绑定(bind)到事件处理程序。

事实上,这与 Crockford 书中的示例几乎相同:Closure in The Good Parts

关于javascript - 创建 <audio> 元素,然后在单击表格单元格时播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903584/

相关文章:

javascript - JQuerysiblings.data() 不返回正确的值

javascript - Webkit 似乎有百分比宽度/高度的问题

javascript - Highcharts 网格线宽度(或颜色)- 单线

javascript - 范围输入以更改文本和图像

html - 将日志文件 (*.txt) 转换为网络友好文件(*.html、*.jsp 等)的最佳方式?

javascript - 如何从用户填写的文本字段中获取 url,并使用 html 或 javascript 在新选项卡中查看

javascript - 相同的域,但仍然得到 "Permission denied to access property ' 文档'”

javascript - 如何缩放路径以适合容器

javascript - 从javascript函数插入HTML div标签

html - 如何使 md-hint 居中对齐(material2)