Uncaught SyntaxErrror: неожиданный токен ILLEGAL в chrome - PullRequest
3 голосов
/ 18 августа 2011

У меня проблема с функцией jQuery ajax. Следующий код прекрасно работает в Mozilla, но не работает в IE или Chrome. Когда я пытаюсь определить проблему с помощью Инструментов разработчика в Chrome, я получаю сообщение об ошибке:

Uncaught SyntaxError: Unexpected token ILLEGAL \n
$.ajax.success

и когда я нажимаю на него, он направляет меня к строке var obj = JSON.parse(data);.

function getdata(){
    $.ajax({
        type:"GET",
        url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
        data: "",
        success: function(data) {
            var obj = JSON.parse(data);
            displayPlaylists(obj);
        }

    });
}

EDIT: Я нашел решение, которое работает в Chrome, но все еще не в IE

function getdata(){
        $.ajax({
                type:"GET",
                url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                dataType:"json",
                success: function(data) {
                    displayPlaylists(data);
                }

            });
    }

добавление dataType: "json" означает, что функция ожидает возвращения данных json и поэтому анализирует их по прибытии (это эквивалентно использованию jQuery.parseJSON), однако, как я уже сказал, это решение все еще не работает IE

Ответы [ 4 ]

2 голосов
/ 18 августа 2011

Поскольку jQuery уже предполагает, что это JSON (из заголовка HTTP), data уже передается как JSON.

Итак, вы используете JSON.parse для объекта (JSON).

Это fais по той же причине:

JSON.parse({}); // parse an object

потому что {} становится строкой:

[object Object]

, который вообще не является допустимым JSON.

Итак, просто удалите JSON.parse.

1 голос
/ 18 августа 2011

Мой javascript linter указывает на наличие символа Юникод в данных JSON, которые он задыхается. Это не должно иметь место, поскольку это действительно JSON, но этот бит:

"The Syndicate Challenge #4 World At War\r\nhttp://www.youtube.com/watch?v\u003d49g7f5lkvQ8"

Кажется, что причина неприятностей. Я не уверен на 100%, так как Firefox, похоже, в любом случае может анализировать данные. Символ Юникода также кажется неуместным, но это может быть я.

1 голос
/ 18 августа 2011

По иронии судьбы, у меня была такая же проблема в Chrome на прошлой неделе, но я подозреваю, что это не только с Chrome, но и с любым браузером.

Используя Chrome Javascript Debugger, разместите точку останова на том же месте, где вы заполняете переменную 'obj' и проверяете, содержит ли 'data' более одного объекта, содержащегося в массиве. В этом случае вы, вероятно, пытаетесь получить доступ к объекту, который находится внутри первой позиции индекса вашего объекта данных.

Если вы отправили анонимный объект json с сервера на страницу, получите доступ к первому индексу, а не к данным напрямую.

Вот так:

function getdata(){
        $.ajax({
                type:"GET",
                url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                data: "",
                success: function(data) {
                    var obj = data.data.items;
                    displayPlaylists(obj);
                }

            });
    }

EDIT:

Я отладил вашу ссылку сам и после ее дальнейшего тестирования я обнаружил, что вам даже не нужно анализировать этот объект. Посмотрите на мой пример выше, передайте data.data.items вашему var obj, и он будет загружен всеми вашими объектами из массива.

Посмотрите, поможет ли это.

1 голос
/ 18 августа 2011

установите dataType в json, и браузер автоматически проанализирует json для вас, посмотрите, работает ли он для вас

  function getdata(){
            $.ajax({
                    type:"GET",
                    dataType:'json',
                    contentType:'application/json',
                    url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                    data: "",
                    success: function(data) {                           
                        displayPlaylists(data);
                    }

                });
        }
...