Soundcloud小工具 - Event.PLAY无效

时间:2013-09-03 17:58:37

标签: javascript api widget soundcloud

我遇到了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);
            });
        });
    }
}

1 个答案:

答案 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));
    }
}