我遇到了SoundCloud Widget API的问题。
出于某种原因,Event.PLAY不再有效......
var i, song, iframes = document.getElementsByTagName('iframe');
for (i = 0; i < iframes.length; i++) {
if (String.prototype.indexOf.call(iframes[i].src, '//w.soundcloud.com/player') > -1)
{
iframes[i].id = "sc_player_"+i;
song = SC.Widget(iframes[i].id);
song.bind(SC.Widget.Events.PLAY, function(eventData){
song.getCurrentSound(function(sound) {
console.log(sound.title);
});
});
}
}
答案 0 :(得分:1)
感谢您报告此事,我们正在研究为什么PLAY活动现在不会在第一次播放时触发。
<强> UPD 即可。现在修复了PLAY
事件未在初始播放时触发的错误。
另一方面,您的代码存在问题:您在循环内创建的函数(事件处理程序)都会将最后一个iframe引用为song
。您应该将事件处理程序创建包装在IFFE中,并将当前song
作为参数传递:
for (i = 0; i < iframes.length; i++) {
if (src.indexOf('//w.soundcloud.com/player') > -1) {
iframes[i].id = "sc_player_"+i;
song = SC.Widget(iframes[i].id);
song.bind(SC.Widget.Events.PLAY, (function (song) {
return function(eventData){
song.getCurrentSound(function(sound) {
console.log(sound.title);
});
}
}(song)));
}
}
或者创建一个辅助函数,它将返回一个引用右song
:
function createEventHandler (song) {
// `song` will be “caught” in the closure
return function (eventData) {
song.getCurrentSound(function (sound) {
console.log(sound.title);
});
}
}
for (i = 0; i < iframes.length; i++) {
if (src.indexOf('//w.soundcloud.com/player') > -1) {
iframes[i].id = "sc_player_"+i;
song = SC.Widget(iframes[i].id);
song.bind(SC.Widget.Events.PLAY, createEventHandler(song));
}
}