$ .each在Firefox中引发错误(e未定义)但在Chrome中运行正常

ofk*_*fko 2 javascript firefox jquery

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

如果您同时拥有Chrome和Firefox,则可以看到它在Chrome中正常运行,但在Firefox Firebug控制台中,您会收到"TypeError:e is undefined"在JSFiddle上,错误显示为"TypeError:obj is undefined"

我花了好几个小时追捕这个bug并试图找出它并最终放弃并来到这里.是什么造成的?

以下是要测试的完整代码:

<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>
Run Code Online (Sandbox Code Playgroud)

Lee*_*ish 5

我看起来数据作为字符串被传递到appendVideos而不是你想象的对象.我做了一个

for(i in data) {
    alert(i+'='+data[i]);
}
Run Code Online (Sandbox Code Playgroud)

而它就像一个字符串.

这解决了它:

$.ajax({
    url: url,
    dataType: 'JSON',
    success: function(data){
      appendVideos(data);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)