1

我在使用 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);
            });
        });
    }
}
4

1 回答 1

1

感谢您报告此问题,我们正在调查为什么 PLAY 事件现在不会在第一次播放时触发。

升级版。现在修复了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));
    }
}
于 2013-09-04T10:20:44.803 回答