2

我在客户的网站上建立了一个区域,显示当前正在播放的歌曲,通过 PHP 从 XML 文件中解析。但是,我的客户希望歌曲自动刷新,而不是手动刷新页面。

我尝试使用 jQuery.get() 和 .ajax() 解析文件,但由于 XML 文件的结构方式,似乎我只能将艺术家和名称压缩成一个字符串,或者当我尝试具体化时,它只返回 [object Object]。

我什至没有尝试过计算歌曲的长度,然后根据该长度刷新提要。我可能看不到,因为这对我来说显然是个问题。

任何帮助或一般指导将不胜感激。

示例工作 PHP 代码(显然,非 AJAX):

<?php
    $recentlyPlayed = simplexml_load_file('http://publicapi.streamtheworld.com/public/nowplaying?mountName=ABCDFM&numberToFetch=1&eventType=track');
    $trackTitle = $recentlyPlayed->{'nowplaying-info'}[0]->property[1];
    $trackArtist = $recentlyPlayed->{'nowplaying-info'}[0]->property[0];
    echo "<h6>" . $trackArtist . "<span class=\"song-title\">" . $trackTitle . "</span></h6>";
?>

我已经尝试了几种不同的方法来使其正常工作,但似乎最初的障碍是尝试使用属性而不是节点名称来引用 XML 文件中的数据。节点都被命名为相同的,这是区分它们的属性。因此,除非艺术家/歌曲标题为空白,否则此代码将正确呈现,然后它会呈现第三个字段,该字段有点神秘地命名为“cue_time_start”。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
<script type="text/javascript">
    $(document).ready(function() {
        setInterval("songPull()",1000);
    });

    function songPull() {
        $.get(
            "http://publicapi.streamtheworld.com/public/nowplaying?mountName=ABCDFM&numberToFetch=1&eventType=track", 
            "xml",
            function(data) {
                $(data).find("nowplaying-info").each(function(){
                    var artist = $(this).find("property").eq(0).text();
                    var title = $(this).find("property").eq(1).text();
                    $('body').html("<h1>" + artist + "<small class=\"song-title\">" + title + "</small></h1>");
                    console.log (artist);
                    console.log (title);
                });
            }
        );
    }
</script>
<body>

</body>

在尝试做此类事情时,任何指导、建议或最佳实践示例将不胜感激。

4

1 回答 1

1

我不确定这是否是您想要的,但您可以简单地使用属性选择器从 XML 文档中提取您想要的数据。

http://jsfiddle.net/P8dc6/

$.get("http://publicapi.streamtheworld.com/public/nowplaying?mountName=KROXFM&numberToFetch=1&eventType=track", 
    "xml",
    function(data) {
        var $nowPlaying = $(data).find('nowplaying-info');
        console.log($nowPlaying.find('[name=track_artist_name]').text());
        console.log($nowPlaying.find('[name=cue_title]').text());
    }
);

此外,永远不要将 a 传递stringsetIntervalor setTimeout,您可以直接传递函数引用:

setInterval(songPull ,1000);
于 2013-04-20T05:18:59.263 回答