Я пытаюсь отладить сценарий JavaScript, который читается в расширении Firefox и выполняется. Я могу видеть ошибки только через консоль Firebug (мой код невидим для Firebug), и он сообщает о «незавершенном строковом литерале».
Я проверил строку и линии вокруг нее, и все кажется прекрасным - круглые скобки, фигурные скобки, кавычки сбалансированы и т. д. Каковы еще возможные причины, которые мне следует искать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Найдите строку, содержащую неэкранированную одинарную кавычку, которая может быть вставлена каким-либо серверным кодом.
Вы можете попробовать запустить сценарий через JSLint.
Я пробовал это. Вывод слишком шумный. Слишком много деталей форматирования, и я не видел ничего, что могло бы заставить скрипт не запускаться.
Попробуйте «бинарный поиск». Удалите половину кода и попробуйте еще раз. Если ошибка не исчезла, удалите половину оставшегося кода. Если ошибки нет, верните то, что вы удалили, и удалите половину. Повторить.
Вы сможете довольно быстро сузить его до нескольких строк. По моему опыту, на этом этапе вы заметите какую-то глупую искаженную строку.
Возможно, будет целесообразно выполнить это с сохраненной версией вывода HTML в браузер, если вы не уверены, в каком ресурсе на стороне сервера возникла ошибка.
Разработчик веб-страницы неправильно угадал, какая кодировка используется браузером зрителя. Обычно это можно решить, указав кодировку в заголовке страницы.
Если вы выполнили вырезание / вставку: некоторые онлайн-подсветки синтаксиса будут искажать одинарные и двойные кавычки, превращая их в отформатированные пары кавычек (совпадающие пары открытия и закрытия). (хотя я не могу найти никаких примеров прямо сейчас) ... Это влечет за собой нажатие Command- + несколько раз и просмотр ваших цитатных символов
Попробуйте также другой шрифт?, разные редакторы и IDE используют разные токенизаторы и правила выделения, а JS - один из более динамических языков для синтаксического анализа, поэтому попробуйте открыть файл в emacs, vim, gedit (с плагинами JS) ... Если вам повезет , один из них покажет длинную фиолетовую строку, проходящую через конец файла.
Отсканируйте код, который появляется до в строке №, указанной в сообщении об ошибке. То, что не завершено, привело к тому, что что-то ниже по потоку (обвиненная строка #) было помечено.
Ищите разрывы строк! Часто это причина.
Я поддержу это - я наткнулся на это, пытаясь решить свою проблему, и все, что мне нужно было сделать, это удалить текст.
Вы знаете причину этого?
Это исправило это для меня, отличный улов.
это сработало и для меня. почему зачем зачем ??
Выполните dos2unix file.js для преобразования переносов строк из CRLF в LF.
Это решило мою проблему
Вы избежали косой черты (/)? У меня были проблемы с этим раньше
У большинства браузеров есть проблемы с таким кодом:
var foo = "</script>";
В Firefox, Opera и IE8 это приводит к ошибке незавершенного строкового литерала. Может быть довольно неприятно при сериализации html-кода, который включает скрипты.
Это было причиной моей ошибки, хотя скрипт прошел JSLint. Я изменил "</script>" на "</ scr" + "ipt>" и это исправило.
Фу. Есть ли в этом причина?
Не могу поверить в это, проблема устранилась. Никогда бы не подумал об этом через миллион лет. :(
Возможно, вы забыли заключить свой скрипт в HTML-комментарии.
невероятно ... исправил это и для меня.
Также подойдет простой уход от косой черты.
о да. у меня тоже работает. Благодарность!
var setScript = "<scr"+"ipt></script>"; вызывает у меня проблемы ... Как это исправить?
Удалось ли нам определить, почему sting "<script>" приводит к ошибке незавершенного строкового литерала? Кажется подозрительным, что разделение строки на 2 разные части является документированным способом исправления этой ошибки. (Ложный положительный результат?)
Я собирался отказаться от поиска и устранения проблем с 400-строчной строкой innerHTML, содержащей несколько тегов сценария ... Это сработало на удивление хорошо !!! ....
Это случилось со мной, когда я копировал и вставлял текстовый редактор в Sublime. Я случайно скопировал возврат каретки и даже не знал, что он там есть. Мне пришлось перемещать курсор по строке, чтобы узнать, где находится возврат каретки.
Пробелы - это еще одна проблема, которую я обнаружил, вызывающая эту ошибку. Может помочь использование функции для обрезки пробелов.
Вы пробовали Chromebug? Это Firebug для расширений.
В прошлом у меня были проблемы с угловыми кавычками (‘), обычно при копировании и вставке из Word. Замена их обычными одинарными кавычками (') помогает.
Возможно, это потому, что в вашем PHP-коде есть разрыв строки. Если вам нужны разрывы строк в сообщении окна предупреждения, включите его как экранированный синтаксис в конце каждой строки в вашем PHP-коде. Обычно я делаю это так:
$message = 'line 1.\\n';
$message .= 'line 2.';
Я бы проголосовал за ответ jamtoday, если бы у меня была "репутация"
Если ваши данные поступают через PHP, это может помочь
$str = str_replace(array("\r", "\n"), '', $str);
К вашему сведению, вы не голосуете «за» ни одного единственного ответа на SO. Голосуйте за / против любого / всех ответов по своему усмотрению.
Исправлена моя проблема - проголосовали за! Спасибо!
Это также устранило мою проблему, жаль, что я не понимаю Почему.
@NielsBom Он просто удаляет разрывы строк (заменяя их ничем)
Это сработало для меня. Спасибо :-)
Также имейте в виду, что% 0A - это URL-адрес символа перевода строки. Мне потребовалось некоторое время, чтобы найти, где в моем оскорбительном коде есть перевод строки.
Я только что обнаружил, что "</script>" работает так же хорошо, как и "</scr"+"ipt>".
Просто избегайте закрытия тегов или используйте код ascii
т.е.
</script>
т.е.
</script>
Если ничего не помогает, поищите символы Юникода, например
\u2028
это может разбить вашу строку более чем на одну строку и вызвать эту ошибку
str = str_replace(array("\r\n","\n\r","\r", "\n"), '<br />', stripslashes($str));
Это должно сработать.
еще одна возможность. в моем случае это произошло из-за неопределенной переменной php $ _POST, используемой в методе отправки xhttp. это привело к завершению строки параметра send ().
Зачем отмечать это как дубликат? У этого вопроса -2 голоса, и это совсем не тот вопрос. Похоже, кому-то больше нечего было делать.