Javascript $。每个都会在Firefox中引发错误(e未定义),但在Chrome中可以正常工作

Javascript $。每个都会在Firefox中引发错误(e未定义),但在Chrome中可以正常工作,javascript,jquery,firefox,Javascript,Jquery,Firefox,请参阅此JSFIDLE: 如果您同时拥有Chrome和Firefox,您可以看到它在Chrome中的工作与预期一样,但在Firefox Firebug控制台中,您会看到“TypeError:e未定义” 在JSFIDLE上,错误显示为“TypeError:obj未定义” 我花了几个小时寻找这个虫子,并试图找出它,最后放弃了,来到这里。是什么引起的 以下是要测试的完整代码: <html> <body> <div id="x"></div>

请参阅此JSFIDLE:

如果您同时拥有Chrome和Firefox,您可以看到它在Chrome中的工作与预期一样,但在Firefox Firebug控制台中,您会看到“TypeError:e未定义” 在JSFIDLE上,错误显示为“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>

$(文档).ready(函数(){
获取视频(“猫”);
});
函数getVideos(查询){
var url='1〕https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=2&q=“+query+”®ionCode=us&type=video&fields=items(id)&key=AIzaSyCCOnozV0lEfnjfMTjpc4TFExAeIGJ6Fh0”;
$.ajax({
url:url,
成功:功能(数据){
附加视频(数据);
}
});
}
功能视频(数据){
//在这里工作
控制台日志(数据);
//但不是每个美元
$.each(data.items,function(i,item){
$('#x')。追加(item.id.videoId+'
'); }); }
看起来数据是作为字符串而不是像您想象的对象传递到视频中的。我做了一个测试

for(i in data) {
    alert(i+'='+data[i]);
}
它就像一根绳子

这修正了它:

$.ajax({
    url: url,
    dataType: 'JSON',
    success: function(data){
      appendVideos(data);
    }
  });
}

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

如果将“成功”功能更改为以下功能,则应能正常工作:

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

    appendVideos(data);
}

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


在jQuery 1.9.1的第622行中发现了错误,这是由于您传递的对象是未定义的。第622行调用了
obj.length
,因为
undefined
没有名为length的属性,所以它抛出并出错


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

当我在FF中发出警报(data.items)时未定义。在ajax请求中将数据类型设置为JSON会强制执行此操作。我们都会遇到忽略明显错误的情况。仅供参考,如果您
警报(数据)
如果您的数据被正确解析为JSON对象,它应该返回
[Object]
。我不知道哪个浏览器更适合这里。我认为Chrome在这里隐式解析为JSON是错误的。如果我看到两个浏览器都有错误,我会更快地发现错误。无论如何,谢谢您的回答。您希望从服务器返回的数据类型。如果未指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将生成XML,在1.4中JSON将生成JavaScript对象,在1.4中脚本将执行脚本,其他任何内容都将作为字符串返回)。可用的类型(以及作为成功回调的第一个参数传递的结果)是:这都是猜测。jQuery正在猜测,Chrome似乎根据内容正确地计算出了MIME类型。我几乎从不包含数据类型。我可以开始了。但是这更多的是关于浏览器而不是jQuery,不是吗?
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);
});