Распространенные источники незавершенного строкового литерала

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

Я проверил строку и строки вокруг нее, и все выглядит нормально: круглые скобки, фигурные скобки, кавычки сбалансированы и т. Д. Какие еще возможные причины следует искать?


person sutee    schedule 22.10.2008    source источник
comment
Зачем помечать это как дубликат? Этот вопрос имеет -2 голоса, и на самом деле это не тот же самый вопрос. Похоже, кому-то больше нечего было делать.   -  person szx    schedule 07.05.2015


Ответы (19)


Большинство браузеров, похоже, имеют проблемы с таким кодом:

var foo = "</script>";

В Firefox, Opera и IE8 это приводит к ошибке незавершенного строкового литерала. Может быть довольно неприятно при сериализации html-кода, который включает скрипты.

person VoY    schedule 03.09.2009
comment
Это было причиной моей ошибки, хотя скрипт прошел JSLint. Я изменил ‹/script› на ‹/scr+ipt›, и это исправило ситуацию. - person richardkmiller; 16.08.2010
comment
Фу. Есть ли причина этого? - person Jere; 14.10.2010
comment
Я не могу в это поверить, это решило проблему. Я никогда бы не догадался об этом за миллион лет. :( - person Jon Tackabury; 14.01.2011
comment
Возможно, вы забыли заключить свой сценарий в HTML-комментарии. - person Lightness Races in Orbit; 29.07.2011
comment
невероятно ... исправил это и для меня тоже. - person rICh; 18.11.2011
comment
Простое экранирование косой черты тоже сработает. - person jayarjo; 11.03.2012
comment
о, да. работает и для меня. Благодарность! - person nicmare; 10.09.2012
comment
var setScript = "<scr"+"ipt></script>"; вызывает у меня проблему... Есть ли способ это исправить? - person SearchForKnowledge; 10.02.2015
comment
Удалось ли нам определить, почему жал "<script>" приводит к ошибке незавершенного строкового литерала? Кажется подозрительным, что разбиение строки на 2 разные части является задокументированным способом исправления этой ошибки. (Ложный положительный результат?) - person Jeremy C.; 05.03.2015
comment
Я собирался отказаться от устранения неполадок с 400-строчной строкой innerHTML, которая содержала несколько тегов сценария... Это сработало на удивление хорошо!!!.... - person repzero; 28.02.2016
comment
Это случилось со мной, когда я копировал и вставлял текстовый редактор в Sublime. Я случайно скопировал возврат каретки и даже не знал, что он там есть. Мне пришлось продвинуть курсор вдоль строки, чтобы узнать, где находится возврат каретки. - person Lonelydatum; 11.08.2017

Ищите разрывы строк! Часто они являются причиной.

person jamtoday    schedule 23.12.2008
comment
Я согласен с этим - я наткнулся на это, пытаясь решить свою проблему, и все, что мне нужно было сделать, это удалить мой текст. - person cryptic_star; 25.05.2011
comment
Вы знаете причину этого? - person Niels Bom; 21.11.2011
comment
Это исправило это для меня, отличный улов. - person CodeVirtuoso; 05.09.2012
comment
это сработало и для меня. почему почему почему?? - person javier_domenech; 24.12.2013
comment
Exec dos2unix file.js для преобразования разрывов строк из CRLF в LF. - person naXa; 25.03.2016
comment
Это решило мою проблему - person Ryuuks; 24.02.2017

Я бы проголосовал за ответ jamtoday, если бы у меня была "репутация"

Если ваши данные поступают через PHP, это может помочь

$str = str_replace(array("\r", "\n"), '', $str);
person PJ Brunet    schedule 07.05.2011
comment
К вашему сведению, вы не голосуете ни за один единственный ответ на SO. Голосуйте за/против любых/всех ответов по своему усмотрению. - person Lightness Races in Orbit; 29.07.2011
comment
Решил мою проблему - проголосовал! Спасибо! - person Graeme Leighfield; 29.09.2011
comment
Это также решило мою проблему, жаль, что я не понимаю, почему. - person Niels Bom; 21.11.2011
comment
@NielsBom Он просто удаляет разрывы строк (заменяя их ничем) - person kehers; 10.11.2012
comment
Это сработало для меня. Спасибо :-) - person John T; 02.11.2014

Я только что обнаружил, что "<\/script>" работает так же хорошо, как "</scr"+"ipt>".

person Queue    schedule 14.09.2011

Просто избегайте закрытия тегов или используйте код ascii.

ie

<\/script>

ie

<&#47;script>
person Brian    schedule 30.12.2011

Вы можете попробовать запустить скрипт через JSLint.

person Andrew Hedges    schedule 22.10.2008
comment
Я пробовал это. Выход слишком шумный. Слишком много деталей форматирования, и я не видел ничего, что могло бы заставить скрипт не запускаться. - person sutee; 23.10.2008

Найдите строку, содержащую неэкранированную одиночную кавычку, которая может быть вставлена ​​каким-либо кодом на стороне сервера.

person Manu    schedule 22.10.2008

Если вы сделали какое-либо вырезание/вставку: некоторые онлайн-подсветчики синтаксиса искажают одинарные и двойные кавычки, превращая их в отформатированные пары кавычек (соответствующие открывающие и закрывающие пары). (хотя я не могу найти никаких примеров прямо сейчас)... Так что это влечет за собой нажатие Command-+ несколько раз и взгляд на ваши кавычки

Попробуйте другой шрифт? кроме того, разные редакторы и IDE используют разные маркеры и правила выделения, а JS является одним из наиболее динамичных языков для анализа, поэтому попробуйте открыть файл в emacs, vim, gedit (с плагинами JS)... Если вам повезет, один из них покажет длинную фиолетовую строку, проходящую через конец файла.

person Gene T    schedule 23.10.2008

Вы избежали косой черты (/)? У меня были проблемы с ними раньше

person meouw    schedule 23.12.2008

В прошлом у меня были проблемы с угловыми кавычками ('), обычно при копировании и вставке из Word. Замена их обычными одинарными кавычками ( ' ) делает свое дело.

person cbaigorri    schedule 27.05.2010

Кроме того, имейте в виду, что %0A — это закодированный URL-адрес символа перевода строки. Мне потребовалось некоторое время, чтобы найти, где в моем оскорбительном коде был перевод строки.

person Tyndareus    schedule 08.07.2011

Если ничего не помогает, поищите символы uni-code, например

\u2028

это может разбить вашу строку более чем на одну строку и вызвать эту ошибку

person Predte4a    schedule 13.03.2012

Может быть, это потому, что у вас есть разрыв строки в вашем PHP-коде. Если вам нужны разрывы строк в вашем сообщении окна предупреждения, включите его в качестве экранированного синтаксиса в конце каждой строки в вашем PHP-коде. Обычно я делаю это следующим образом:

$message = 'line 1.\\n';
$message .= 'line 2.';
person Ipsoratio    schedule 02.12.2010

Пробовали ли вы Chromebug? Это Firebug для расширений.

person Álvaro González    schedule 31.03.2010

Попробуйте "бинарный поиск". Удалите половину кода и повторите попытку. Если ошибка все еще существует, удалите половину оставшегося кода. Если ошибки нет, верните то, что вы удалили, и удалите половину этого. Повторение.

Вы должны быть в состоянии сузить его до нескольких строк довольно быстро. По моему опыту, в этот момент вы заметите какую-то глупую искаженную строку.

Может быть целесообразно выполнить это на сохраненной версии HTML-вывода в браузер, если вы не уверены, в каком ресурсе на стороне сервера возникла ошибка.

person Chase Seibert    schedule 23.10.2008

Разработчик веб-страницы неправильно угадал, какая кодировка используется браузером зрителя. Обычно это можно решить, указав кодировку в заголовке страницы.

person Windows programmer    schedule 23.10.2008

Отсканируйте код, который идет перед строкой, указанной в сообщении об ошибке. Что бы ни было незавершенным, это привело к тому, что что-то ниже по течению (обвиняемая строка №) должно быть помечено.

person Chris Noe    schedule 23.10.2008

Пробелы - еще одна проблема, которую я нахожу, вызывает эту ошибку. Может помочь использование функции для обрезки пробелов.

person Lea    schedule 31.03.2010

str = str_replace(array("\r\n","\n\r","\r", "\n"), '<br />', stripslashes($str));

Это должно работать.

person Vishal Venugopal    schedule 19.12.2012
comment
еще одна возможность. в моем случае это было связано с неопределенной переменной php $_POST, используемой в методе отправки xhttp. это привело к завершению строки параметра send(). - person ShaileshKumarMPatel; 08.08.2019