Uncaught SyntaxError: Несподіваний маркер:


193

Я виконую дзвінок 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();
  });
});

1
JSON чудово. Мабуть, проблема полягає в тому, як ви впораєтеся. Показ коду допоможе.
tcooc

1
До питання додана частина коду.
trobrock

Здається, немає нічого поганого в синтаксисі, JS і JSON. Розміщення (не) робочого тестового випадку на jsfiddle.net допоможе - включаючи HTML.
Оскар Кравчик

1
В даний час я прив’язую до Інтернету, тому мій модем стискає джерело HTML веб-сайтів, які я переглядаю, тому я не можу реально робити голови або хвости з коду. Але для початку введіть кожен код JS у зовнішні файли - це завжди полегшує налагодження - ви дізнаєтесь, що погода викликає JS або щось інше.
Оскар Кравчик

2
"Несподіваний маркер", ймовірно, є деяким незаконним кодом символів. Такий код, ймовірно, не з’явиться під час друку на консоль. Тому друкуйте рядок по одному символу одночасно або використовуйте аналізатор протоколу або налагоджувач тощо, щоб побачити фактичні байти рядка.
GroovyDotCom

Відповіді:


94

Побачення червоних помилок

Uncaught SyntaxError: Несподіваний маркер <

на вкладці консолі розробника Chrome вказується HTML у тілі відповідей.

Те, що ви насправді бачите, - це реакція вашого браузера на несподіваний верхній рядок <!DOCTYPE html>від сервера.


4
Я поняття не маю, чому ви говорите про "Несподіваний маркер <", коли йдеться про питання Unexpected token :. Ваша відповідь абсолютно не пов'язана з проблемою ОП.
Michał Perłakowski

1
І як це виправити? У мене є перенаправлення php, яке спричиняє це в Chrome.
Працює для проживання

7
Щоб додати до @andy_magoon, у моєму випадку у мене був тег скрипту, який повинен був обслуговувати JavaScript, але оскільки запит було перенаправлено на сторінку HTML (не важливо, чому він був перенаправлений), що починається з <! DOCTYPE html >, що недійсний JavaScript, браузер повертає SyntaxError при спробі розбору HTML як JS.
david.barkhuizen

2
@Thom Спосіб виправити це - переконатися, що HTTP отримує повернений файл JavaScript, який ви шукаєте, а не несподіваний HTML.
david.barkhuizen

1
Я отримав саме цю помилку, оскільки, як виявляється, шлях до файлу невірний, і він не може знайти файл, вказаний у тезі скрипту.
новачок

80

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


4
Я думаю, що у мене є зворотна проблема. Я прошу JSON від стороннього API, і вони повертають додаток / JavaScript як відповідь, і я отримую ту саму помилку, про яку ви повідомили в цьому запитанні. Не знаєте, як з цим боротися.
wuliwong

5
Дивна проблема полягає в тому, що вона працює чудово на локальному хості, але не на суворому рівні. Будь-яка ідея чому?
VishwaKumar

Привіт. У мене є точна проблема, і я не можу її вирішити, може хтось скаже мені, як ви відправляєте JSON назад на сервер
Alen

Дякую, що я надсилав програму / javascript (як я неправильно читав це SO ) і отримував цю помилку на простому дійсному JSON. Змінивши його, щоб application/jsonусунути помилку. Я не використовую JSONP.
науковець

Навіть я отримую ту саму помилку "Uncaught SyntaxError: Unexpected token:", навіть після отримання відповіді у форматі json {"success": true, "data": 2593}
Rupali Pemare

41

Це зі мною щойно трапилось, і причина була ні з однієї з вищезгаданих причин. Я використовував команду 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; 
}

Сподіваємось, це допоможе комусь у майбутньому.


Це мені дуже допомогло. Ми повинні обертати дані json за допомогою даних jsoncallback, коли ми використовуємо метод jsonp. Також дані jsonpcallback не повинні починатися з цифр. Коли я спробував з номерами, це не вийшло. Коли я спробував його в тому ж форматі, який показаний у цій відповіді, він спрацював ...
Ганеш Бабу

Правда, але помилка така ж, і код буде виграшно виграшним і все ще працюватиме, якщо використовується JSON.
Похмурий ...

Це працювало для мене з AJAX, jQuery & JSONP. Дуже дякую!
Пьотр Віттхен

16

Я щойно вирішив проблему. Виникла проблема, яка викликала проблеми зі стандартним запитом виклику, тому це код, який я використовував замість цього:

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

Якщо хтось знає, чому стандартний об’єкт Запит створював мені проблеми, я хотів би знати.


3
різниця між стандартним запитом та request.json здебільшого в заголовках, додає this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- йди фігуру
Dimitar Christoff

Дивно, що саме це викликало проблеми з цим.
trobrock

3
Які $$там двійки ?
фальсарела

@DimitarChristoff - будь-яка відповідь за фальсарелу про $$?
ведмідь

1
@bear Подвійний вибір долара визначений в MooTools.
Ентоні Фолл

10

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

Я отримував: Uncaught SyntaxError: Unexpected token <і помилка вказувала на цей рядок у моїй заяві про успіх Ajax:

var total = $.parseJSON(response);

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

Я виявив це, просто зробивши так console.log(response), щоб побачити, що насправді надсилається. Якщо це проблема з даними JSON, просто спробуйте дізнатися, чи можете ви зробити console.log чи якусь іншу заяву, яка дозволить вам побачити, що надсилається та що отримується.


1
Я зробив це. Я повторював json десь в інді-файлі php і отримував у відповіді php [// json data], але я не зміг його розібрати. Дякуємо за повідомлення про це, щоб я міг зрозуміти власну помилку.
Ніколас Декер

Проблема з ОП зовсім інша. У вашому випадку ви намагаєтеся розібрати HTML як JSON, а у випадках (іх) ОП він намагається проаналізувати JSON як JavaScript.
Michał Perłakowski

7

Коли ви запитуєте свій файл JSON, сервер повертає Content-Typeзаголовка JavaScript ( 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

Здається, ваша відповідь якось оцінюється. Це дає ту саму помилку в Chrome:

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

Це пов’язано з тим, що дужки '{...}' інтерпретуються javascript як блок коду, а не об'єкт, буквальний, як можна було очікувати.

Я б подивився на функцію JSON.decode () і побачив, чи є там eval.

Аналогічна проблема тут: Eval () = Неочікуваний маркер: помилка


2

Якщо нічого не має сенсу, ця помилка також може бути викликана помилкою 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

Поява помилки " Uncaught SyntaxError: Unexpected token ", коли ваші дані повертають неправильний формат json, у деяких випадках ви не знаєте, що ви отримали неправильний формат json.
будь ласка, перевірте це попередженням (); функція

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

з помилкою " Uncaught SyntaxError: Несподіваний маркер ",
але якщо ви помиляєтесь у форматі json,
наприклад:

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

або

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

щоб ви помилилися у форматі json, виправте його, перш ніж ви отримаєте JSON.decode або JSON.parse


3
Я рекомендую використовувати console.log()замість alert()налагодження.
Michał Perłakowski

1

Це сталося і зі мною сьогодні. Я використовував EF та повертав Entity у відповідь на дзвінок AJAX. Віртуальні властивості моєї сутності викликали помилку циклічної залежності, яку не було виявлено на сервері. Додавши атрибут [ScriptIgnore] у віртуальні властивості, проблема була виправлена.

Замість використання атрибута ScriptIgnore, мабуть, було б краще просто повернути DTO.


1

Це сталося через те, що у мене на експрес-сервері встановлено правило, щоб направити будь-які 404 назад до /#плюс будь-який оригінальний запит. Дозволити кутовий маршрутизатор / js обробляти запит. Якщо немає маршруту js для обробки цього шляху, /#/whateverна сервер робиться запит, який є лише запитом, для /всієї веб-сторінки.

Так, наприклад, якщо я хотів зробити запит, /correct/somejsfile.jsале я пропустив його, щоб /wrong/somejsfile.jsзапит був зроблений на сервері. Це місце / файл не існує, тому сервер відповідає "a" 302 location: /#/wrong/somejsfile.js. Браузер із задоволенням слідкує за переспрямуванням, і вся веб-сторінка повертається. Браузер розбирає сторінку як js, і ви отримуєте

Uncaught SyntaxError: Несподіваний маркер <

Тож для пошуку шляху / запиту порушника шукайте 302 запити.

Сподіваюся, що хтось допомагає.


1

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


ОП використовує JSON, а не JSONP.
Michał Perłakowski

0

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


1
Це питання про "Неочікуваний маркер : ".
Michał Perłakowski

0

У моєму випадку я зіткнувся з тією ж помилкою під час запуску весняної програми mvc через неправильне відображення в моєму контролері mvc

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

я змінив вищевказане відображення на

 @RequestMapping("/private/updatestatus")

або

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

0

Для мене ввімкнулася лампочка, коли я переглянув джерело на сторінці всередині браузера Chrome. У мене була додаткова дужка в операторі if. Ви одразу побачите червоне коло з хрестом у ньому на відмінній лінії. Це досить корисне повідомлення про помилку, оскільки маркер синтаксису Uncaught Error: Unexpected помилка не посилається на номер рядка, коли він вперше з’являється в консолі Chrome.


0

Я в цьому помилявся

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

Вже я запустив цю fsзмінну. Знову я помістив varу другий рядок. Цей також дає таку помилку ...


0

Для тих, хто відчуває це в AngularJs 1.4.6 або подібному, моя проблема полягала в тому, що кутовий не знайшов мій шаблон, оскільки файл у templateUrl(шлях), який я надав, не вдалося знайти. Я просто повинен був забезпечити доступний шлях, і проблема пішла.


Я вирішив ту саму проблему, виправивши URL-адресу baseref - вказав на кореневу папку => <base href = "/">
Abdeali Chandanwala

0

У моєму випадку це була помилкова URL-адреса (не існує), тому, можливо, ваше "надіслати" у другому рядку має бути іншим ...


0

Моєю помилкою було забуття єдиної / подвійної цитати навколо URL у javascript:

так неправильний код був:

window.location = https://google.com;

і правильний код:

window.location = "https://google.com";

-2

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'" ...

Але помилка не має нічого спільного з проблемою ..


ОП запитала про "Несподіваний маркер : ".
Michał Perłakowski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.