2

看到这个 JSFiddle:http: //jsfiddle.net/cDVQP/1/

如果您同时拥有 Chrome 和 Firefox,您可以看到它在 Chrome 中按预期工作,但在 Firefox Firebug 控制台中,您会收到“TypeError:e 未定义”在 JSFiddle 上,错误显示为“TypeError:obj 未定义”

我花了几个小时寻找这个错误并试图找出它,最后放弃并来到这里。是什么原因造成的?

这是要测试的完整代码:

<html>
<body>

  <div id="x"></div>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script type="text/javascript">

    $(document).ready(function(){
      getVideos('cats');
    });

    function getVideos(query){
      var url = 'https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&q='+query+'&regionCode=us&type=video&fields=items(id)&key=AIzaSyCCOnozV0lEfnjfMTjpc4TFExAeIGJ6Fh0';
      $.ajax({
        url: url,
        success: function(data){
          appendVideos(data);
        }
      });
    }

    function appendVideos(data){
      // works here
      console.log(data);

      // but not in $.each
      $.each(data.items, function(i, item){
        $('#x').append(item.id.videoId + '<br>');
      });
    }

  </script>

</body>
</html>
4

4 回答 4

5

我看起来数据是作为字符串传递到 appendVideos 中的,而不是像你想象的那样的对象。我做了一个

for(i in data) {
    alert(i+'='+data[i]);
}

它就像一个字符串。

这修复了它:

$.ajax({
    url: url,
    dataType: 'JSON',
    success: function(data){
      appendVideos(data);
    }
  });
}
于 2013-02-24T23:12:14.700 回答
2

在 jQuery 1.9.1 的第 622 行发现错误,这是由您传递的 Object 引起的undefined。第 622 行调用obj.length并因为undefined没有称为长度的属性,所以它抛出和错误。

添加dataType: 'JSON'到您的$.ajax请求将修复此错误

于 2013-02-24T23:19:36.420 回答
1

除了其他答案,为什么不直接使用getJSON呢?

var url = 'https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&q='+query+'&regionCode=us&type=video&fields=items(id)&key=AIzaSyCCOnozV0lEfnjfMTjpc4TFExAeIGJ6Fh0';
$.getJSON(url, function(data) 
{
    appendVideos(data);
});
于 2013-02-24T23:17:50.857 回答
0

看起来 jQuery 在 Firefox 中不会自动将响应解析为 json,而是将其解释为字符串。

如果您将成功功能更改为以下内容,它应该可以工作:

success: function(data){
    if(typeof(data) === 'string') {
        data = JSON.parse(data);
    }

    appendVideos(data);
}
于 2013-02-24T23:12:38.743 回答