Howler.js - 从 array/for-loop 引用和触发文件
Howler.js - referencing and triggering files from an array/for-loop
我正在尝试使用数组和 for 循环来索引和命名一些 Howls 和 Howl 触发器按钮。
我已经参考了这个问题来实现我想要实现的目标:Howler - Random sound
与我的不同之处在于它没有随机方面,而且我添加了一些方法调用。
我正在将用于触发 Howls 的按钮添加到循环中,这似乎是失败的地方 - 即单击按钮时。
单击任一按钮时控制台报告以下内容:
Uncaught TypeError: Cannot read property 'play' of undefined
具体指这个:sounds[i].play();
or 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();
});
}
我有一个 non-array/for-loop 版本可以正常使用 2 个 Howls,而 add/remove class 的东西也可以正常工作所以请忽略它。
我最终会从数组中生成 16 个 Howls。
这是一个包含标记结构的 fiddle:Howler Fiddle
任何帮助将不胜感激,在此先感谢。
我在这里看到两个问题:
- 您在
click
处理程序中引用变量 i
而未维护范围。因此,它总是将 i
视为最后一个值。您可以使用 bind
作为解决此问题的一种方法:
$('#' + sounds[i] + ' span.ascii-play').on('click', function (i2, e) {
sounds[i2].play();
}.bind(null, i));
- 您正试图在
sounds
上调用 play
,它没有保存对 Howl
对象的引用。您应该改为在 howls[sounds[i2]]
上调用 play
。
编辑:在这种情况下,使用 forEach
更容易,因此我更新了您的 fiddle 来执行此操作,并在此处修复范围问题:http://jsfiddle.net/zmjz7sf3/1/。
我正在尝试使用数组和 for 循环来索引和命名一些 Howls 和 Howl 触发器按钮。
我已经参考了这个问题来实现我想要实现的目标:Howler - Random sound
与我的不同之处在于它没有随机方面,而且我添加了一些方法调用。
我正在将用于触发 Howls 的按钮添加到循环中,这似乎是失败的地方 - 即单击按钮时。
单击任一按钮时控制台报告以下内容:
Uncaught TypeError: Cannot read property 'play' of undefined
具体指这个:sounds[i].play();
or 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();
});
}
我有一个 non-array/for-loop 版本可以正常使用 2 个 Howls,而 add/remove class 的东西也可以正常工作所以请忽略它。
我最终会从数组中生成 16 个 Howls。
这是一个包含标记结构的 fiddle:Howler Fiddle
任何帮助将不胜感激,在此先感谢。
我在这里看到两个问题:
- 您在
click
处理程序中引用变量i
而未维护范围。因此,它总是将i
视为最后一个值。您可以使用bind
作为解决此问题的一种方法:
$('#' + sounds[i] + ' span.ascii-play').on('click', function (i2, e) {
sounds[i2].play();
}.bind(null, i));
- 您正试图在
sounds
上调用play
,它没有保存对Howl
对象的引用。您应该改为在howls[sounds[i2]]
上调用play
。
编辑:在这种情况下,使用 forEach
更容易,因此我更新了您的 fiddle 来执行此操作,并在此处修复范围问题:http://jsfiddle.net/zmjz7sf3/1/。