2013-02-24 1 views
2

Смотрите эту JSFiddle: http://jsfiddle.net/cDVQP/1/

Если у вас есть как Chrome и Firefox вы можете увидеть, что он работает, как ожидается, в Chrome, но в Firefox Firebug консоли вы получите «TypeError: е не определен» на 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> 
+0

Ну, когда я предупрежу (data.items) Я получаю неопределенный в FF. – Leeish

ответ

5

Я похож данные передается в appendVideos как строку, а не объект, как вы думаете. Я сделал a

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

И это действует как строка.

Это зафиксировал его:

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

Мы все сталкиваемся с ситуациями, когда мы пропускаем очевидное. FYI, если вы «предупреждаете (данные)», он должен возвращать '[Object]', если ваши данные правильно разбираются в объект JSON. – Leeish

+0

Я не знаю, какой браузер больше здесь. Я думаю, что Chrome здесь не прав, чтобы неявно разобрать JSON. Если бы я видел, что ошибка - оба браузера, я бы нашел ошибку раньше. В любом случае спасибо за ответ. – ofko

+0

Тип данных, которые вы ожидаете от сервера. Если ни один не указан, jQuery попытается вывести его на основе типа ответа MIME (тип XML MIME даст XML, в 1.4 JSON будет создан объект JavaScript, в 1.4 скрипт выполнит скрипт, и все остальное будет возвращается как строка). Доступные типы (и результат, полученный в качестве первого аргумента для вашего обратного вызова успеха): Это все догадка. jQuery делает угадывание, и похоже, что Chrome правильно определил тип MIME на основе содержимого. Я почти никогда не включаю dataType. Я мог бы начать. – Leeish

0

Похоже Jquery автоматически не разбирая ответ как JSON в Firefox, а это интерпретировать его как строку.

Если вы измените функцию успеха на следующее должно работать:

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

    appendVideos(data); 
} 
+2

Установка типа данных как JSON в запросе ajax заставляет это сделать. – Leeish

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

Там найдена ошибка в строке 622 из JQuery 1.9.1 Это вызвано объект, который вы передаете в настоящее время undefined. Строка 622 делает вызов obj.length, а с undefined не имеет свойства, называемого длиной, которое он выбрасывает и вызывает ошибку.

Добавление dataType: 'JSON' к вашему $.ajax запросу будет исправить эту ошибку

+0

Но это больше связано с браузером, чем с jQuery, нет? – ofko

Смежные вопросы