Uncaught SyntaxError: Неожиданный токен: - PullRequest
172 голосов
/ 29 июня 2010

Я выполняю вызов AJAX в моем скрипте MooTools, в Firefox это работает нормально, но в Chrome я получаю ошибку Uncaught SyntaxError: Unexpected token :, я не могу определить, почему. Комментируя код, чтобы определить, где плохой код ничего не дает, я думаю, что это может быть проблемой с возвращаемым JSON. Проверяя в консоли, я вижу, что JSON вернул это:

{"votes":47,"totalvotes":90}

Я не вижу никаких проблем с этим, почему эта ошибка произошла?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});

Ответы [ 19 ]

84 голосов
/ 28 октября 2014

Просмотр красных ошибок

Uncaught SyntaxError: Неожиданный токен <</p>

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

На самом деле вы видите реакцию вашего браузера на неожиданную верхнюю строку <!DOCTYPE html> с сервера.

78 голосов
/ 29 августа 2010

Просто к вашему сведению для людей, которые могут столкнуться с той же проблемой - мне просто пришлось заставить мой сервер отправлять обратно JSON как application / json, и обработчик jQuery по умолчанию работал нормально.

41 голосов
/ 02 мая 2012

Это только что случилось со мной, и причина не была ни одной из причин выше. Я использовал команду jQuery getJSON и добавил callback=? для использования JSONP (как мне нужно было для междоменной работы), а также возвратил код JSON {"foo":"bar"} и получил ошибку.

Это потому, что я должен был включить данные обратного вызова, что-то вроде jQuery17209314005577471107_1335958194322({"foo":"bar"})

Вот код PHP, который я использовал для достижения этой цели, который ухудшается, если используется JSON (без обратного вызова):

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

Надеюсь, это поможет кому-то в будущем.

16 голосов
/ 01 июля 2010

Я только что решил проблему.Было что-то, что вызывало проблемы со стандартным вызовом Request, поэтому я использовал этот код:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

Если кто-нибудь знает, почему стандартный объект Request доставлял мне проблемы, я бы хотел знать.

10 голосов
/ 19 декабря 2013

Я думал, что добавлю свою проблему и решение в список.

Я получаю: Uncaught SyntaxError: Unexpected token <, и ошибка указывала на эту строку в моем заявлении об успехе ajax:

var total = $.parseJSON(response);

Позже я обнаружил, что в дополнение к результатам json отправлялся HTML с ответом, потому что в моем PHP была ошибка. Когда вы получаете сообщение об ошибке в PHP, вы можете настроить его, чтобы оно предупреждало вас об огромных оранжевых таблицах, и именно эти таблицы отбрасывали JSON.

Я узнал об этом, просто набрав console.log(response), чтобы увидеть, что на самом деле отправляется. Если это проблема с данными JSON, попробуйте посмотреть, можете ли вы сделать console.log или другой оператор, который позволит вам увидеть, что отправлено и что получено.

7 голосов
/ 29 декабря 2015

Когда вы запрашиваете ваш файл JSON, сервер возвращает заголовок JavaScript Content-Type (text/javascript) вместо JSON (application/json).

Согласно Документам MooTools :

Ответы с типом содержимого javascript будут оцениваться автоматически.

В результате MooTools пытается оценить ваш JSON как JavaScript, а когда вы пытаетесь оценить такой JSON:

{"votes":47,"totalvotes":90}

как JavaScript, парсер обрабатывает { и } как область видимости блока вместо нотации объекта. Это то же самое, что вычисление следующего «кода»:

"votes":47,"totalvotes":90

Как видите, : здесь совершенно неожиданно.

Решение состоит в том, чтобы установить правильный Content-Type заголовок для файла JSON. Если вы сохраните его с расширением .json, ваш сервер должен сделать это сам.

4 голосов
/ 13 августа 2015

Похоже, ваш ответ как-то оценивается.Это дает ту же ошибку в Chrome:

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

Это происходит из-за того, что скобки '{...}' интерпретируются javascript как блок кода, а не как литерал объекта, как можно было ожидать.

Я бы посмотрел на функцию JSON.decode () и увидел, есть ли там eval.

Подобная проблема здесь: Eval () = Неожиданный токен: ошибка

1 голос
/ 25 марта 2016

Это случилось и со мной сегодня. Я использовал EF и возвращал Entity в ответ на вызов AJAX. Виртуальные свойства моей сущности вызывали ошибку циклической зависимости, которая не обнаруживалась на сервере. При добавлении атрибута [ScriptIgnore] к виртуальным свойствам проблема была исправлена.

Вместо использования атрибута ScriptIgnore, вероятно, было бы лучше просто вернуть DTO.

1 голос
/ 09 ноября 2018

Если ничего не имеет смысла, эта ошибка также может быть вызвана ошибкой PHP, встроенной в html / javascript, например, приведенной ниже

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

Не <br /> и т. Д. В коде, который PHP вставляет в html, вызывает ошибку . Чтобы исправить эту ошибку (подавить предупреждение), используйте этот код в начале

error_reporting(E_ERROR | E_PARSE);

Для просмотра щелкните правой кнопкой мыши на странице «Просмотр источника», а затем просмотрите полный HTML-файл, чтобы определить эту ошибку.

1 голос
/ 27 января 2018

Это произошло из-за того, что на моем экспресс-сервере я настроил правило для маршрутизации любых 404 обратно на /# плюс любой исходный запрос. Разрешение углового маршрутизатора / JS для обработки запроса. Если нет js-маршрута для обработки этого пути, на сервер отправляется запрос к /#/whatever, который является просто запросом к /, всей веб-странице.

Так, например, если я хотел сделать запрос на /correct/somejsfile.js, но я пропустил, набрал его /wrong/somejsfile.js, запрос сделан на сервер. Это местоположение / файл не существует, поэтому сервер отвечает 302 location: /#/wrong/somejsfile.js. Браузер успешно выполняет перенаправление, и вся веб-страница возвращается. Браузер анализирует страницу как js, и вы получаете

Uncaught SyntaxError: Неожиданный токен <</p>

Таким образом, чтобы помочь найти неправильный путь / запрос, найдите 302 запроса.

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...