在动态创建新的播放器iFrame时,Soundcloud HTML5 Widget API中的Nullpointer异常

时间:2012-12-30 13:24:19

标签: html5 gwt html5-video soundcloud

我可以在一个小代码片段上减少我的问题。代码动态创建SC播放器iFrame并显示就绪状态。如果已经存在iFrame,它将删除旧的iFrame并创建一个新的(在JSFIDDLE上可运行example):

var player;
var playerId;
var iframe;
var printReady=
function(data)
{
    document.getElementById("status").innerHTML = "Ready";  
};
function createSoundCloudIframe()
{
    document.getElementById("status").innerHTML = "Player not ready";
    var contentDiv = document.getElementById("content");

    // Remove last Iframe
    if(iframe != null){
        player.unbind(SC.Widget.Events.READY);
        contentDiv.removeChild(iframe);
    }
    // Create a new Iframe
    iframe = document.createElement("IFRAME");
    iframe.id = playerId + "ScId";            
    iframe.src = "http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F41867062&show_artwork=true";

    // Append Iframe
    contentDiv.appendChild(iframe);

    // Show ready status
    player = SC.Widget(playerId + "ScId");
    player.bind(SC.Widget.Events.READY, printReady);

    playerId ++;
};

第一次执行代码时运行正常。但是当你第二次尝试它时,这个api.js方法会抛出一个nullpointer异常(开发者控制台):

// Uncaught TypeError: Cannot read property 'parentWindow' of null
function s(a) {
            return a.contentWindow || a.contentDocument.parentWindow
}

导致执行的方法是SC.Widget(iFrameId);

在我的情况下,这个问题无法通过SC.Widget(iFrameId).load(url, options);函数和隐藏iFrame来解决: 我为SC小部件api写了一个google-web-toolkit包装器,并在一个更大的项目中使用这个包装器和其他gwt mediaplayer包装器。在这个项目中,异常会被重复抛出,延迟几毫秒,这会减慢一切。上面的代码片段只是问题的纯粹javascript减少。

我真的需要一种解决方法,在移除iFrame时删除并清除api.js中的所有死引用!我正在寻找一个月的解决方法。

0 个答案:

没有答案