Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.08.2014, 19:46
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

ошибка 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 вообще получается не срабатывает, то есть всё затыкается именно на нем. Подскажите пожалуйста кто сталкивался с подобным, в чем может быть дело. Или остается только смириться с этим?
Ответить с цитированием
  #2 (permalink)  
Старый 21.08.2014, 22:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Ну какбэ вы сами нашли причину. В js нельзя использовать многострочные string'и. Экранируйте переносы, или используйте иной способ доставить текст в js.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 21.08.2014, 23:47
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

Сообщение от Aetae Посмотреть сообщение
Экранируйте переносы, или используйте иной способ доставить текст в js.
Хорошо, а как их экранировать?
Ответить с цитированием
  #4 (permalink)  
Старый 22.08.2014, 04:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

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

Последний раз редактировалось Aetae, 22.08.2014 в 04:47.
Ответить с цитированием
  #5 (permalink)  
Старый 22.08.2014, 19:17
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

попробовал, к сожалению не помогло. Выдает такую же ошибку.
Вы говорили придумать другой способ доставки многострочного текста в javascript. Я вот думаю, а если этот текст разбивать на массив, в качестве разделителя используя перенос строки, а потом соединять с помощью конкатенации. Не подскажите как на js разделить его на массив? И можно ли вообще в качестве разделителя использовать перевод строки?
Ответить с цитированием
  #6 (permalink)  
Старый 22.08.2014, 19:29
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Это надо делать не в js а в php. Выше код тоже php. Кстати возможно у вас там кавычки ещё в тексте есть. Попробуйте:
$obj = addcslashes($obj, "\r\n\"\'");
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 22.08.2014, 22:18
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

попробовал, тоже самое. Текст даже без кавычек передаю.
Ответить с цитированием
  #8 (permalink)  
Старый 22.08.2014, 22:20
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

а как вообще убрать из текста все переносы на php, чтобы передавать его в js без них?
Ответить с цитированием
  #9 (permalink)  
Старый 22.08.2014, 23:58
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

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

Последний раз редактировалось Aetae, 23.08.2014 в 00:01.
Ответить с цитированием
  #10 (permalink)  
Старый 25.08.2014, 22:52
Аспирант
Отправить личное сообщение для kuchuluk Посмотреть профиль Найти все сообщения от kuchuluk
 
Регистрация: 04.04.2014
Сообщений: 33

Так тоже не работает. echo выдало
{'id':'67', 'text':'строчка 1
строчка 2
строчка 3 ', 'filename': '672HkAYSTd.', 'success':''}
То есть как положено.

Но я переделал вот так
$obj = str_replace("\r\n",'',$obj);
	$obj = str_replace("\n",'',$obj);

То есть убираю все переносы перед передачей его в js. Так работает. Главное что в базу данных он передается с переносами.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Uncaught SyntaxError: Unexpected token ILLEGAL | JS, Django MichaelPak Общие вопросы Javascript 5 12.11.2013 16:52
Не работает AJAX если есть перевод строки pashin76 AJAX и COMET 17 02.10.2013 13:36
Ошибка: SyntaxError: Unexpected token ILLEGAL CrazyBite Общие вопросы Javascript 2 18.07.2013 10:40
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37