Uncaught SyntaxError: Неожиданный токен:

Я запускаю вызов AJAX в своем MooTools script, это отлично работает в 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();
  });
});

Ответ 1

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

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 задавал мне проблемы, я хотел бы знать.

Ответ 2

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

Ответ 3

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

Неподготовленный SyntaxError: Неожиданный токен <

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

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

Ответ 4

Это произошло со мной, и причина не в том, что было выше. Я использовал команду 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; 
}

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

Ответ 5

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

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

var total = $.parseJSON(response);

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

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

Ответ 6

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

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

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

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

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

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

"votes":47,"totalvotes":90

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

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

Ответ 7

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

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

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

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

Аналогичный вопрос здесь: Eval() = Неожиданный токен: ошибка

Ответ 8

У меня была та же проблема, и оказалось, что Json, возвращенный с сервера, не был действительным Json-P. Если вы не используете вызов как междоменный вызов, используйте обычный Json.

Ответ 9

" Невозможно отобразить синтаксисError: Неожиданный токен", когда ваши данные возвращают неправильный формат json, в некоторых случаях вы не знаете, что у вас неправильный формат json.
проверьте его с помощью alert(); функция

onSuccess : function(resp){  
   alert(resp);  
}

ваше полученное сообщение должно быть: { "firstName": "John", "lastName": "Doe" }
и затем вы можете использовать код ниже

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

с ошибкой " Неактивный синтаксисError: Неожиданный токен"
но если вы ошибаетесь json format
ex:

... { "firstName": "John", "lastName": "Doe" }

или

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

чтобы вы получили неправильный формат json, исправьте его перед тем, как JSON.decode или JSON.parse

Ответ 10

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

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

Ответ 11

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

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

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

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

Надеюсь, что это помогает кому-то.

Ответ 12

Я получил "SyntaxError: Unexpected token I", когда использовал jQuery.getJSON(), чтобы попытаться де-сериализовать значение с плавающей запятой Infinity, закодированное как INF, что является незаконным в JSON.

Ответ 13

В моем случае я столкнулся с той же ошибкой при запуске приложения spring mvc из-за неправильного сопоставления в моем контроллере mvc

@RequestMapping(name="/private/updatestatus")

i изменил приведенное выше отображение на

 @RequestMapping("/private/updatestatus")

или

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)

Ответ 14

Для меня лампочка продолжалась, когда я просматривал источник на странице внутри браузера Chrome. У меня была дополнительная скобка в выражении if. Вы сразу увидите красный круг с крестом в нем на провальной линии. Это довольно бесполезное сообщение об ошибке, потому что ошибка Syncax Uncaught: неожиданный токен не ссылается на номер строки, когда она впервые появляется в консоли Chrome.

Ответ 15

Я сделал неправильно в этом

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

Я уже инициализировал переменную fs. Но я снова ставил var во вторую строку. Это также дает такую ​​ошибку...

Ответ 16

Для тех, кто испытывал это в AngularJs 1.4.6 или аналогичной, моя проблема заключалась в том, что angular не смог найти мой шаблон, потому что файл по templateUrl (путь), который я указал, не был найден. Я просто должен был обеспечить доступный путь, и проблема ушла.

Ответ 17

Если ничего не имеет смысла, эта ошибка также может быть вызвана ошибкой 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 файл, чтобы определить эту ошибку.

Ответ 18

В моем случае это был ошибочный URL (не существует), поэтому, возможно, ваш 'send' во второй строке должен быть другим...

Ответ 19

Uncaught SyntaxError: Неожиданный токен}

Chrome предоставил мне ошибку для этого образца кода:

<div class="file-square" onclick="window.location = " ?dir=zzz">
    <div class="square-icon"></div>
    <div class="square-text">zzz</div>
</div>

и решил, что привязка onclick будет выглядеть как

... onclick="window.location = '?dir=zzz'" ...

Но ошибка не имеет ничего общего с проблемой.