Остановка цикла, когда не определено - PullRequest
0 голосов
/ 27 июня 2011

ОБНОВЛЕНИЕ 6:

Исходя из console.log, я заметил, что некоторые объекты имеют:

thumbnail: Array[2]

Другие имеют:

thumbnail: Object

и другие вообще его не имеют.

Так что, похоже, @Felix Kling может быть правдой.

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20%22http%3A%2F%2Ffeeds.bbci.co.uk%2Fnews%2Frss.xml%22&format=json&callback=cbfunc

, если вы не можете получить доступ кссылка, попробуйте:

http://pastebin.com/T4GPQvtk

ОБНОВЛЕНИЕ 5:

Я все еще получаю URL как неопределенный с:

for (var i = 0; i < news.length; i++) {
    news[i].thumbnail = ( $.isArray( news[i].thumbnail ) ) ? news[i].thumbnail : [news[i].thumbnail];

    buildHTML.push( "<a href='" + news[i].thumbnail[0].url + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );
}

ОБНОВЛЕНИЕ 4:

Следующее:

buildHTML.push( "<a href='" + news[i].thumbnail[0] ? news[i].thumbnail[0].url : $.isArray( news[i].thumbnail ) + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );

дает мне:

Uncaught TypeError: Cannot read property 'url' of undefined

ОБНОВЛЕНИЕ 3:

Похоже, что следующее не работает:

buildHTML.push( "<a href='" + news[i].thumbnail[0] ? news[i].thumbnail[0].url : news[i].thumbnail.url + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );

Я получаю ошибку:

Uncaught TypeError: Cannot read property 'url' of undefined

ОБНОВЛЕНИЕ 2:

Кажется, не работает следующее:

buildHTML.push( "<a href='" + news[i].thumbnail=$.isArray(news[i].thumbnail)?news[i].thumbnail:[news[i].thumbnail] + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );

Я получаю ошибку:

Uncaught ReferenceError: Invalid left-hand side in assignment
$.ajax.successyql_news_widget.js:25
bjquery-1.4.2.min.js:124
c.extend.ajax.Ajquery-1.4.2.min.js:125
(anonymous function)yql:1

ОБНОВЛЕНИЕ 1:

Проблема возникает, когда я добавляю изображение для толкания следующим образом:

buildHTML.push( "<img src='" + news[i].thumbnail[0].url + "' /><a href='" + news[i].link + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );

ОРИГИНАЛЬНЫЙ ВОПРОС:

Из последующегоURL-адрес:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20%22http%3A%2F%2Ffeeds.bbci.co.uk%2Fnews%2Frss.xml%22&format=json&callback=cbfunc

Я пытаюсь захватить данные следующим образом:

function get_news() {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20%22http%3A%2F%2Ffeeds.bbci.co.uk%2Fnews%2Frss.xml%22&format=json&callback=cbfunc&rand=" + Math.random(),
        type: 'GET',
        dataType: 'jsonp',
        jsonp: 'callback',
        jsonpCallback: 'cbfunc',
        error: function(xhr, status, error) {
            alert(xhr.responseText);
        },
        success: function(data) { 

            var buildHTML = [];

            var news = data.query.results.rss.channel.item;

            for (var i = 0; i < news.length; i++) {
                buildHTML.push( "<a href='" + news[i].link + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );
            }

            $('.portlet-content').empty().append(buildHTML.join("<br /><br />"))

        }

    });

}

Это прекрасно работает, пока секция миниатюр выглядит следующим образом:

"thumbnail": [
{
    "height": "49",
    "url": "http://news.bbcimg.co.uk/media/images/48915000/jpg/_48915868_48915872.jpg",
    "width": "66"
}
{
    "height": "81",
    "url": "http://news.bbcimg.co.uk/media/images/52468000/jpg/_52468689_48915872.jpg",
    "width": "144"
}
]

Однако, когда секция миниатюр выглядит следующим образом:

"thumbnail": {
    "height": "81",
    "url": "http://news.bbcimg.co.uk/media/images/53705000/jpg/_53705922_012314461-1.jpg",
    "width": "144"
}

Я получаю сообщение об ошибке "undefined", цикл останавливается, и на экране ничего не появляется.

Как мне проигнорировать их и продолжить выполнение сценария, не останавливаясь на ошибке?

Ответы [ 4 ]

3 голосов
/ 27 июня 2011

Вы можете создать массив, если json соответствует 2-му примеру (еще не массив):

news[i].thumbnail=($.isArray(news[i].thumbnail))
                   ? news[i].thumbnail
                   : [news[i].thumbnail];
1 голос
/ 27 июня 2011

Судя по вашим комментариям, вы, похоже, хотите:

for (var i = 0; i < news.length; i++) {
    var item = news[i];

    if($.isArray(item.thumbnail)) {
        var size = +item.thumbnail[0].width * +item.thumbnail[0].height,
            selected = 0;
        for(var j = 1, jl = item.thumbnail.length; j < jl; j++) {
            var t_size = +item.thumbnail[j].width * +item.thumbnail[j].height;
            if(t_size < size) {
                size = t_size;
                selected = j;
            }
        }
        buildHMTL.push("<img src='" + news[i].thumbnail[selected].url + "' />");
    }
    buildHTML.push( "<a href='" + item.link + "' target='_blank'>" + item.title + "</a><br />" + item.pubDate );
}
1 голос
/ 27 июня 2011

Добавьте скобки [] для приведения «эскиза» от объекта к массиву.

"thumbnail": [ { "height": "81", "url": "http://news.bbcimg.co.uk/media/images/53705000/jpg/_53705922_012314461-1.jpg", "width": "144" }]

будет работать

0 голосов
/ 27 июня 2011

Вы можете использовать Попробуйте перехватить или простой IF перед кодом, чтобы проверить, находится ли код в нужном формате, прежде чем пытаться манипулировать им.Кажется, проблема в том, что, если ваши миниатюры «массив» - это только один объект, они не отправляются в виде массива.Простая проверка if может решить эту проблему, если у вас есть

. Вы можете использовать условный оператор, который будет выглядеть примерно так:

buildHTML.push( "<img src='" + news[i].thumbnail[0] ? news[i].thumbnail[0].url : news[i].thumbnail.url + "' /><a href='" + news[i].link + "' target='_blank'>" + news[i].title + "</a><br />" + news[i].pubDate );

UPDATE это условное выражение будетнайдите URL, или он просто вернет "".Я не видел, чтобы у некоторых товаров не было URL, поэтому мое первое предложение не сработало.Используйте это выражение для получения вашего URL

news[i].thumbnail ? news[i].thumbnail[0] ? news[i].thumbnail[0].url : news[i].thumbnail.url : ''
...