1

请帮忙!!当我搜索这个时,我看到了很多混合的结果,没有一个适用于此。我的目标基本上是将随机且动态填充的歌曲列表转换为播放列表,以便每首歌曲一个接一个地播放,并且 youtube 或 soundcloud 的 iframe 按顺序排列。

我有一个从 youtube 和 soundcloud api 填充的简单歌曲列表,它输出到无序列表。当列表中的每首歌曲被加载到浏览器中时,它的锚标签会被赋予一个 id。

//List Item
echo "<a id=\"" . $i . "\" href=\"javascript:void(0)\" onclick=\"play_clicked('youtube',".$i.",".$song_count.")\">
                            <li class = \"song\">";

列表中的第一首歌曲的 id 为 0,第二首歌曲的 id 为 1,依此类推。每首歌曲的媒体 ID 在加载时也会一次“推送”到一个 JavaScript 数组,因此歌曲的锚标记的 ID 对应于保存歌曲媒体 ID 的数组中的键。

echo 
'<script type="text/javascript">

track_id_array.push("'.$vid_id.'");

</script>';

我创建了一个在单击歌曲时调用的 javascript 函数:

function play_clicked(api_type,clicked_key,song_count)

该函数接收 api 类型的参数 - soundcloud 或 youtube、锚点 id 或单击的媒体 id 所在的数组键,然后是列表中有多少首歌曲。有一个 for 循环遍历媒体 ID 数组:

for (var i=clicked_key; i<=song_count; i++){

所以我从点击歌曲的 id 开始循环,目标是继续遍历点击歌曲之后的歌曲。首先,我检查媒体 ID 是否存在于数组中:

if(window.track_id_array[i])

如果存在,它应该保存媒体的 id - 例如 youtube id - 6_8ZZtL6qmM。然后我检查它是 soundcloud 还是 youtube 歌曲,根据哪个,我将带有 ajax 的媒体 id 发送到一个 php 脚本,该脚本会将 id 嵌入到 soundcloud 或 youtube 的 html5 iframe 嵌入小部件中,如下所示:

$vid_id = $_GET[id];

//Youtube player embed
echo '<iframe width="498" height="280" src="http://www.youtube.com/embed/'.$vid_id. '?autoplay=1" frameborder="0" allowfullscreen></iframe>
';

然后我将此 html 返回到我的主页中的 div,歌曲将在相应的小部件中播放。我想象的实现播放列表目标的方式是从循环中单击的歌曲的 id/key 开始,从数组中检索该键的媒体 id,检查 api 类型,进行正确的 ajax 调用,设置超时对于歌曲的长度,然后在歌曲播放完毕后让循环继续到数组中的下一个键,这样它就会从列表中的下一首歌曲或数组中的 id 开始该过程。

Javascript 真的不是我的强项,我讨厌为此必须使用客户端代码。我的问题是,我在这里描述的方法是否可行,或者我是不是走错了路?我只想在循环中一个接一个地进行 ajax 调用,因此它们不会同时发生。这是我的全部功能,我得到了一些奇怪的结果。它播放列表中的最后一首歌曲并跳过所有其他歌曲。任何解释也许是为什么?再次,我真的不擅长使用 javascript,非常感谢您的帮助!

//play clicked track and those following
function play_clicked(api_type,clicked_key,song_count){

function showPlayTrack() {
                    if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        var outLink = xhr.responseText;
                    }
                    else {
                        var outLink = "There was a problem with the request" + xhr.status;
                    }
                    }
                    var vis = parent.document.getElementById("play_content");

                    vis.innerHTML = outLink;

                    setTimeout(300000);
}   


for (var i=clicked_key;i<=song_count;i++){

    if(window.track_id_array[i]){

        if(api_type == "scloud"){

                var soundcloud_id = window.track_id_array[i];

                if (window.XMLHttpRequest) {
                xhr = new XMLHttpRequest();
                }
                else {
                    if (window.ActiveXObject) {
                        try {
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (e) { 
                        }
                    }
                }

                if (xhr) {
                    xhr.onreadystatechange = showPlayTrack;
                    xhr.open("GET", "getsoundcloud.php?streamurl="+soundcloud_id, true);


                }
                else {
                    alert("Sorry, but I could't create an XMLHttpRequest");
                }



        }else if (api_type == "youtube"){


            var vid_id = window.track_id_array[i];

            if (window.XMLHttpRequest) {
                xhr = new XMLHttpRequest();
                }
                else {
                    if (window.ActiveXObject) {
                        try {
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (e) { 
                        }
                    }
                }

                if (xhr) {
                    xhr.onreadystatechange = showPlayTrack;
                    xhr.open("GET", "getyoutube.php?streamurl="+vid_id, true);
                    xhr.send(null);

                }
                else {
                    alert("Sorry, but I could't create an XMLHttpRequest");
                }

        }
    }
}
}
4

1 回答 1

1

好的,所以我通过使用递归函数调用解决了这个问题。单击时我调用播放函数,它读取媒体 ID、检查 api 类型、递增密钥并调用 ajax 以获取 iframe。ajax 的成功函数然后将 iframe 返回到适当的 div,等待歌曲的长度,然后以递增的键作为参数再次调用初始播放函数。还有一些小事情需要解决,比如如果用户在媒体中搜索时增加或减少时间,但在大多数情况下,这是一个很棒的播放列表解决方案!

于 2012-06-06T14:03:56.290 回答