ошибка Unexpected token ILLEGAL если есть перенос строки в тексте
Сделал загрузку фотографий на аяксе без перезагрузки страницы с использованием тега iframe. Вместе с фотографией загружается еще и текст. Сам скрипт, который производит загрузку фото на сервер и текста в базу данных отрабатывает нормально и вызывает функцию, в качестве параметра которой передает json-строку jsOnResponse("{'id':'" . $lastId . "', 'text':'" . $text . "', 'filename': '" . $fileName . "', 'success':'" . $success . "'}"); . В этом json-объекте содержится файл только загруженный и текст только что записанный в БД. Вот код этой функции:
function jsOnResponse($obj) { echo ' <script type="text/javascript"> window.parent.onResponse("'.$obj.'"); </script> '; } То есть этот PHP скрипт вызывает js функцию, которая сразу после загрузки выводит тут же эту картинку только что загруженную и текст. Вот код этой функции: function onResponse(d) { eval('var obj = ' + d + ';'); alert('Файл ' + obj.filename + (obj.success ? " " : " НЕ ") + "загружен."); var parentDiv = document.getElementById("vkPostsListing"); parentDiv.className = 'oneVKPost'; var all_tags = parentDiv.getElementsByTagName('div')[0]; var container = document.createElement('div'); container.innerHTML = "<p class='vktext'>" + obj.text + "</p><p class='vkimage' ><img src='/images/vkimages/" + obj.filename + "'></p>"; parentDiv.insertBefore(container, all_tags); } Всё работает нормально картинка и текст выводятся как надо, если только в тексте нет переноса строки. Если же в тексте содержится перенос строки, то файл и текст загружаются на сервер, но не выводятся, то есть js скрипт не дорабатывает. Консоль js показывает ошибку Uncaught SyntaxError: Unexpected token ILLEGAL. JS скрипт onResponse вообще получается не срабатывает, то есть всё затыкается именно на нем. Подскажите пожалуйста кто сталкивался с подобным, в чем может быть дело. Или остается только смириться с этим? |
Ну какбэ вы сами нашли причину. В js нельзя использовать многострочные string'и. Экранируйте переносы, или используйте иной способ доставить текст в js.
|
Цитата:
|
$obj = addcslashes($obj, "\r\n"); |
попробовал, к сожалению не помогло. Выдает такую же ошибку.
Вы говорили придумать другой способ доставки многострочного текста в javascript. Я вот думаю, а если этот текст разбивать на массив, в качестве разделителя используя перенос строки, а потом соединять с помощью конкатенации. Не подскажите как на js разделить его на массив? И можно ли вообще в качестве разделителя использовать перевод строки? |
Это надо делать не в js а в php. Выше код тоже php. Кстати возможно у вас там кавычки ещё в тексте есть. Попробуйте:
$obj = addcslashes($obj, "\r\n\"\'"); |
попробовал, тоже самое. Текст даже без кавычек передаю.
|
а как вообще убрать из текста все переносы на php, чтобы передавать его в js без них?
|
Так стоп, у вас там ещё eval зачем-то. Вам надо тогда тройное экранирование фигачить(\\\\n). Вот только eval там нафиг не нужен.
Так попробуйте: function jsOnResponse($obj) { $obj = addcslashes($obj, "\r\n"); echo ' <script type="text/javascript"> window.parent.onResponse('.$obj.'); </script> '; } function onResponse(obj) { alert('Файл ' + obj.filename + (obj.success ? " " : " НЕ ") + "загружен."); var parentDiv = document.getElementById("vkPostsListing"); parentDiv.className = 'oneVKPost'; var all_tags = parentDiv.getElementsByTagName('div')[0]; var container = document.createElement('div'); container.innerHTML = "<p class='vktext'>" + obj.text + "</p><p class='vkimage' ><img src='/images/vkimages/" + obj.filename + "'></p>"; parentDiv.insertBefore(container, all_tags); } Если не будет работать - покажите, что вообще выдаёт echo $obj; чистым текстом. |
Так тоже не работает. echo выдало
{'id':'67', 'text':'строчка 1 строчка 2 строчка 3 ', 'filename': '672HkAYSTd.', 'success':''} То есть как положено. Но я переделал вот так $obj = str_replace("\r\n",'',$obj); $obj = str_replace("\n",'',$obj); То есть убираю все переносы перед передачей его в js. Так работает. Главное что в базу данных он передается с переносами. |
Часовой пояс GMT +3, время: 02:58. |