Howler.js - 从数组/for循环中引用和触发文件

Howler.js - referencing and triggering files from an array/for-loop

本文关键字:引用 文件 循环 for js 数组 Howler      更新时间:2023-09-26

我正在尝试使用数组和for循环来索引和命名一些嚎叫和嚎叫触发按钮。

我已经参考了这个问题来表达我想要实现的目标: 吼叫 - 随机声音
与我的不同之处在于它没有随机方面,而且我添加了一些方法调用。

我正在将用于触发 Howls 的按钮添加到循环中,这就是它似乎失败的地方 - 即单击按钮时。

单击任一按钮时,控制台会报告以下内容:

Uncaught TypeError: Cannot read property 'play' of undefined具体指:sounds[i].play();还是sounds[i].pause();

这是JS:

var sounds = ['sound1', 'sound2'];
var howls = {};
for (var i=0; i<sounds.length; i++) {
    howls[sounds[i]] = new Howl({
        urls: ['http://powellian.com/assets/audio/' + sounds[i] + '.mp3', 'http://powellian.com/assets/audio/' + sounds[i] + '.ogg'],
        volume: 1,
        onplay: function() {
            console.log('Playing: ' + sounds[i]);
            $(sounds[i]).removeClass('static').addClass('playing');
            $(sounds[i] + ' span.ascii-play').addClass('hide');
            $(sounds[i] + ' span.ascii-pause').removeClass('hide');
        },
        onpause: function() {
            console.log('Paused: ' + sounds[i]);
            $(sounds[i]).removeClass('playing').addClass('paused');
            $(sounds[i] + ' span.ascii-play').removeClass('hide');
            $(sounds[i] + ' span.ascii-pause').addClass('hide');
        },
        onend: function() {
            console.log('Finished: ' + sounds[i]);
            $(sounds[i]).removeClass().addClass('static');
            $(sounds[i] + ' span.ascii-play').removeClass('hide');
            $(sounds[i] + ' span.ascii-pause').addClass('hide');
        }
    });
    // PLAY btn
    $('#' + sounds[i] + ' span.ascii-play').on('click', function (e) {
        sounds[i].play();
    });
    // PAUSE btn
   $('#' + sounds[i] + ' span.ascii-pause').on('click', function (e) {
        sounds[i].pause();
    });
}

我有一个非数组/for 循环版本,可以正常工作,并且可以使用 2 个 Howls,并且添加/删除类的东西工作正常,所以请忽略它。

我最终将从数组中生成 16 个嚎叫。

这是一个包含标记结构的小提琴:吼叫小提琴

任何帮助将不胜感激,提前感谢。

我在这里看到两个问题:

  1. 您引用click处理程序中的变量i而不维护作用域。因此,它将始终将i视为最后一个值。您可以使用bind作为解决此问题的一种方法:

$('#' + sounds[i] + ' span.ascii-play').on('click', function (i2, e) { sounds[i2].play(); }.bind(null, i));

  1. 您正在尝试在 sounds 上调用 play,这不保存对Howl对象的引用。您应该改为在howls[sounds[i2]]上呼叫play

编辑:在这种情况下,使用forEach更容易,所以我更新了你的小提琴来做到这一点,并在这里修复了范围问题:http://jsfiddle.net/zmjz7sf3/1/。