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'" ...
Но ошибка не имеет ничего общего с проблемой.