Javascript.RU

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

Ответ сервера в плугине ajaxForm отдается неправильно.
Использую jQuery плугин ajaxForm для отправки формы с параметрами и upload files. Функция этого плугина $ajaxSubmit
работает нормально. Все параметры пересылаются, файл загружается, сервер формирует ответ и я его получаю по success

$("#form_upload").ajaxSubmit(
{
data: outData,
iframe: true,
dataType: "text/html; charset=UTF-8",
success: function(data){ parsingResult(data); } //принимает ответ от сервера
}

Но!!!
я c сервера отсылаю строку вот такого вида, с экранироваными ковычками.
[\"<div height='34px' width=15px class=\\\"error\\\">По этому запросу ни чего не найдено.</div>\"]

получаю уже в success: function(data) измененную, что меня очень не устраивает.
["<div height="34px" width="15px" class="\&quot;error\&quot;">По этому запросу ни чего не найдено.</div>"]

Как я понимаю это происходит потому, что ответ сервера вначале вставляется в document, а потом из него отдается success: function(data).

а раз вставился в document, то сам браузер уже распарсил передаваемый текст и заменил все по своему усмотрению.
Тем более FF и IE отдают разные стринги.

Вот и вопрос, Как получить ответ сервера напрямую, без обработки при вставлении в document.
Сижу, инет перелапачиваю уже 3 день... и все без толку.
А в сорсах ajaxForm что-то разобраться не могу.
Заранее благодарен тому гуру кто в этом понимает.
Ответить с цитированием
  #2 (permalink)  
Старый 10.12.2009, 20:57
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Что за бред? Никто никуда ничего не вставялет. Примените другой dataType, ато все-таки не особо похоже на хтмл то, что Вы получаете от сервера К примеру, dataType: 'json'. (Да, и емнип dataType != encoding)
Ответить с цитированием
  #3 (permalink)  
Старый 11.12.2009, 00:03
Новичок на форуме
Отправить личное сообщение для IgorOk Посмотреть профиль Найти все сообщения от IgorOk
 
Регистрация: 10.12.2009
Сообщений: 7

Естественно, перепробовал все варианты dataType.
И кстати, не бред.
В сорсах изменил позицию вывода iframe, так что бы видно было что туда вносится после ответа сервера

Код:
var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />');
$io.css({ position: 'absolute', top: '5px', left: '400px' });
А там, в iframe, моя строка уже подправленная браузером, которая мне потом и отдается. Кстати, это получается только когда отправляю на upload file.
Если без файла, то ни каких проблем с кодировкой.
По коду видно, что если есть файл для аплоада то iframe в страницу обязательно добавляется (Ajax что бы без перезагрузки страницы работало).
Попробую перед посылкой с сервера html.encode делать, а потом decode
Ответить с цитированием
  #4 (permalink)  
Старый 11.12.2009, 01:00
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Просмотрел код. Попробуйте так: dataType: 'json', + передавайте с сервера свою строку, как value textarea. То еть ответ с сервера будет типа
<textarea>[\"<div height='34px' width=15px class=\\\"error\\\">По этому запросу ни чего не найдено.</div>\"]</textarea>

В этом случае плагин должен выбрать значение textarea и вернуть его в responseText.
Ответить с цитированием
  #5 (permalink)  
Старый 11.12.2009, 03:38
Новичок на форуме
Отправить личное сообщение для IgorOk Посмотреть профиль Найти все сообщения от IgorOk
 
Регистрация: 10.12.2009
Сообщений: 7

После использования textarea получаю вот такую строку
Код:
<textarea>["&lt;div height='34px' width=15px class=\"error\"&gt;По этому запросу ни чего не найдено.&lt;/div&gt;"]</textarea>
уже лучше, но тоже обработанную браузером. Похоже что при вставлении в тело документа он дизактивирует html код.

Решение своей проблемы нашел.
Перед отсылкой с сервера обрабатываю мою строку Html.Encode,
а после получения из iframe делаю Html.Decode

Хотя, может что нибудь вместо <textarea> попробовать, поэксперементировать. Что бы Encode/Decode не использовать.
Ведь после <textarea> можно Decode сделать и отсечь сам тэги с textarea, то получу требуемое... У меня много длинных стрингов передается, интересно какой способ из этих менее ресурсоёмчее
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2009, 14:08
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Что-то путаница у нас с Вами какая-то. Вот тестовая страница:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<title>Без имени</title>

	<meta http-equiv="content-type" content="text/html;charset=utf-8" />

	<meta name="generator" content="Geany 0.18" />

</head>

<body>

	<textarea>[\"<div height='34px' width=15px class=\\\"error\\\">По этому запросу ни чего не найдено.</div>\"]</textarea>
    <button onclick="alert(document.getElementsByTagName('textarea')[0].value)">Get Value</button>
</body>

</html>


Выводит без экранирования. Дайте ссылку на проблемную страничку, или реализуйте тестовую, которая описывает проблему.
Ответить с цитированием
  #7 (permalink)  
Старый 11.12.2009, 20:17
Новичок на форуме
Отправить личное сообщение для IgorOk Посмотреть профиль Найти все сообщения от IgorOk
 
Регистрация: 10.12.2009
Сообщений: 7

Потестировал. Ваш вариант просто с textarea, работает без проблем.

Загрузил его во фрэйм
Код:
<iframe id="ifr" name="ifr" src="file_with_textarea.htm"></iframe>
<button onclick="alert( document.frames['ifr'].document.body.innerHTML)">Get Value</button>
Ведь в плугине ajaxForm этот textarea лежит внутри iframe. И как только я забираю стрингу из textarea расположенную в ифрейме получается проблема описанная выше.
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2009, 20:26
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Так с innerHTML так и должно быть, вроде как. Смотрите не innerHTML, а
document.frames['ifr'].document.getElementsByTagName('textarea')[0].value
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2009, 21:23
Новичок на форуме
Отправить личное сообщение для IgorOk Посмотреть профиль Найти все сообщения от IgorOk
 
Регистрация: 10.12.2009
Сообщений: 7

Точно. попробовал с
Код:
document.frames['ifr'].document.getElementsByTagName('textarea')[0].value
стринга передается без изменений.
Спасибо!

Теперь надо попробовать в исходниках ajaxForm, исправить взятие данных из фрейма с innerHtml на value. А затем протестировать в моем приложении

Обязательно напишу, получилось ли это у меня
Ответить с цитированием
  #10 (permalink)  
Старый 11.12.2009, 21:37
Новичок на форуме
Отправить личное сообщение для IgorOk Посмотреть профиль Найти все сообщения от IgorOk
 
Регистрация: 10.12.2009
Сообщений: 7

К удивлению быстро получилось в плугине поменять
Код:
с
xhr.responseText = doc.body ? doc.body.innerHTML : null;
на
xhr.responseText = doc.body ? doc.getElementsByTagName('textarea')[0].value : null;
Все работае нормально. Но вот стоит ли мне переживать за кроссбраузерность этой замены. Разработчики ajaxForm наверно подумали об этом.
Просто вроде где-то читал, что getElementsByTagName не везде работает корректно.
Это так?
Ответить с цитированием
Ответ



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

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