Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Ответ сервера в плугине ajaxForm отдается неправильно. (https://javascript.ru/forum/jquery/6630-otvet-servera-v-plugine-ajaxform-otdaetsya-nepravilno.html)

IgorOk 10.12.2009 15:46

Ответ сервера в плугине 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 что-то разобраться не могу.
Заранее благодарен тому гуру кто в этом понимает.

e1f 10.12.2009 20:57

Что за бред? Никто никуда ничего не вставялет. Примените другой dataType, ато все-таки не особо похоже на хтмл то, что Вы получаете от сервера :) К примеру, dataType: 'json'. (Да, и емнип dataType != encoding)

IgorOk 11.12.2009 00:03

Естественно, перепробовал все варианты 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

e1f 11.12.2009 01:00

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

В этом случае плагин должен выбрать значение textarea и вернуть его в responseText.

IgorOk 11.12.2009 03:38

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

e1f 11.12.2009 14:08

Что-то путаница у нас с Вами какая-то. Вот тестовая страница:
<!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>


Выводит без экранирования. Дайте ссылку на проблемную страничку, или реализуйте тестовую, которая описывает проблему.

IgorOk 11.12.2009 20:17

Потестировал. Ваш вариант просто с 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 расположенную в ифрейме получается проблема описанная выше.

e1f 11.12.2009 20:26

Так с innerHTML так и должно быть, вроде как. Смотрите не innerHTML, а
document.frames['ifr'].document.getElementsByTagName('textarea')[0].value

IgorOk 11.12.2009 21:23

Точно. попробовал с
Код:

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

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

Обязательно напишу, получилось ли это у меня

IgorOk 11.12.2009 21:37

К удивлению быстро получилось в плугине поменять
Код:

с
xhr.responseText = doc.body ? doc.body.innerHTML : null;
на
xhr.responseText = doc.body ? doc.getElementsByTagName('textarea')[0].value : null;

Все работае нормально. Но вот стоит ли мне переживать за кроссбраузерность этой замены. Разработчики ajaxForm наверно подумали об этом.
Просто вроде где-то читал, что getElementsByTagName не везде работает корректно.
Это так?


Часовой пояс GMT +3, время: 14:57.