1

小さなコード スニペットで問題を軽減できました。このコードは、SC プレーヤーの iFrame を動的に作成し、準備完了ステータスを表示します。iFrame が既に存在する場合は、古いものを削除して新しいものを作成します ( JSFIDDLE で実行可能な例)。

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 内のすべての無効な参照を削除してクリーンアップする回避策が本当に必要です! 私は月のそのような回避策を探しています。

4

0 に答える 0