未定义时循环停止

时间:2011-06-27 09:37:56

标签: json jquery jsonp yql

更新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 );

原始问题:

来自以下网址:

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"
}

我收到错误“未定义”,循环停止,屏幕上什么都没有。

如何忽略这些内容,并在不停止错误的情况下继续运行脚本?

4 个答案:

答案 0 :(得分:3)

如果json匹配第二个示例(还不是数组),您可以创建一个数组:

news[i].thumbnail=($.isArray(news[i].thumbnail))
                   ? news[i].thumbnail
                   : [news[i].thumbnail];

答案 1 :(得分:1)

添加[]括号以将“thumbnail”从对象转换为数组。

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

将起作用

答案 2 :(得分:1)

根据您的评论,您似乎想要这样:

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 );
}

答案 3 :(得分:0)

您可以在代码之前使用Try catch或简单IF来检查代码是否符合您想要的格式,然后再尝试操作它。问题似乎是如果你的缩略图'array'只是一个对象,它不会作为数组发送。一个简单的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 );

<强>更新 这个条件表达式将找到URL或它将只返回“”。我没有看到有些项目没有URL,这就是我的第一个建议不起作用的原因。使用此表达式获取您的网址

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