JQuery каждый выводит только первую итерацию JSON - PullRequest
3 голосов
/ 21 августа 2011

Используя этот код:

$.each(data.toptracks.track, function(index, item){
    $('.lastfm').append('<figure class="clearfix"><p><a href="'+item.url+'">'+item.name+'</a>'+item.artist.name+'</p><div class="vinyl"><img class="recordLabel" src="' + item.image[3]['#text'] + '" /></div></figure>');
});

используйте этот URL для просмотра JSON:

http://ws.audioscrobbler.com/2.0/?method=user.gettoptracks&user=benhowdle89&api_key=b25b959554ed76058ac220b7b2e0a026&format=json

По какой-то причине выводится только первая итерация (?)!

jSFiddle link: http://jsfiddle.net/MS3Gu/

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Возможно, потому что на второй итерации item не имеет свойства image, поэтому item.image[3]['#text'] приведет к его аварийному завершению.

{
    "toptracks": {
        "track": [{
            "name": "Someone Like You",
            "duration": "284",
            "playcount": "1033",
            "mbid": "",
            "url": "http:\/\/www.last.fm\/music\/Adele\/_\/Someone+Like+You",
            "streamable": {
                "#text": "1",
                "fulltrack": "0"
            },
            "artist": {
                "name": "Adele",
                "mbid": "b0335a95-8a12-4c71-8149-5054ec847d04",
                "url": "http:\/\/www.last.fm\/music\/Adele"
            },
            "image": [{
                "#text": "http:\/\/userserve-ak.last.fm\/serve\/34s\/55125087.png",
                "size": "small"
            },
            {
                "#text": "http:\/\/userserve-ak.last.fm\/serve\/64s\/55125087.png",
                "size": "medium"
            },
            {
                "#text": "http:\/\/userserve-ak.last.fm\/serve\/126\/55125087.png",
                "size": "large"
            },
            {
                "#text": "http:\/\/userserve-ak.last.fm\/serve\/300x300\/55125087.png",
                "size": "extralarge"
            }],
            "@attr": {
                "rank": "1"
            }
        },
        {
            "name": "Somebody To Love Me (ft. Boy George & Miike Snow)",
            "duration": "298",
            "playcount": "1011",
            "mbid": "",
            "url": "http:\/\/www.last.fm\/music\/Mark%2BRonson%2B%2526%2BThe%2BBusiness%2BIntl\/_\/Somebody%2BTo%2BLove%2BMe%2B%2528ft.%2BBoy%2BGeorge%2B%2526%2BMiike%2BSnow%2529",
            "streamable": {
                "#text": "0",
                "fulltrack": "0"
            },
            "artist": {
                "name": "Mark Ronson & The Business Intl",
                "mbid": "146a66b3-5544-4b7e-9b69-9b53ee30746a",
                "url": "http:\/\/www.last.fm\/music\/Mark%2BRonson%2B%2526%2BThe%2BBusiness%2BIntl"
            },
/* NO IMAGE PROPERTY */
            "@attr": {
                "rank": "2"
            }
        },
// ...

Поскольку свойства image нет,когда вы делаете item.image, он возвращает undefined, поэтому item.image[3] пытается найти свойство 3 в undefined.

Чтобы исправить это, вы можете проверить каждый уровень глубины, чтобы сделатьопределенные свойства существуют.

if( item.image && item.image[3] && item.image[3]['#text'] ) { 
    var txt = item.image[3]['#text']; 
} else { 
    var txt = ''; 
}
1 голос
/ 21 августа 2011

Это потому, что второй элемент в этом массиве просто не содержит image[3] свойства.

...