Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   ошибка Unexpected token ILLEGAL если есть перенос строки в тексте (https://javascript.ru/forum/server/49635-oshibka-unexpected-token-illegal-esli-est-perenos-stroki-v-tekste.html)

kuchuluk 21.08.2014 19:46

ошибка 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 вообще получается не срабатывает, то есть всё затыкается именно на нем. Подскажите пожалуйста кто сталкивался с подобным, в чем может быть дело. Или остается только смириться с этим?

Aetae 21.08.2014 22:25

Ну какбэ вы сами нашли причину. В js нельзя использовать многострочные string'и. Экранируйте переносы, или используйте иной способ доставить текст в js.

kuchuluk 21.08.2014 23:47

Цитата:

Сообщение от Aetae (Сообщение 326957)
Экранируйте переносы, или используйте иной способ доставить текст в js.

Хорошо, а как их экранировать?

Aetae 22.08.2014 04:40

$obj = addcslashes($obj, "\r\n");

kuchuluk 22.08.2014 19:17

попробовал, к сожалению не помогло. Выдает такую же ошибку.
Вы говорили придумать другой способ доставки многострочного текста в javascript. Я вот думаю, а если этот текст разбивать на массив, в качестве разделителя используя перенос строки, а потом соединять с помощью конкатенации. Не подскажите как на js разделить его на массив? И можно ли вообще в качестве разделителя использовать перевод строки?

Aetae 22.08.2014 19:29

Это надо делать не в js а в php. Выше код тоже php. Кстати возможно у вас там кавычки ещё в тексте есть. Попробуйте:
$obj = addcslashes($obj, "\r\n\"\'");

kuchuluk 22.08.2014 22:18

попробовал, тоже самое. Текст даже без кавычек передаю.

kuchuluk 22.08.2014 22:20

а как вообще убрать из текста все переносы на php, чтобы передавать его в js без них?

Aetae 22.08.2014 23:58

Так стоп, у вас там ещё 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; чистым текстом.

kuchuluk 25.08.2014 22:52

Так тоже не работает. 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.