10.12.2009, 15:46
|
Новичок на форуме
|
|
Регистрация: 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="\"error\"">По этому запросу ни чего не найдено.</div>"]
Как я понимаю это происходит потому, что ответ сервера вначале вставляется в document, а потом из него отдается success: function(data).
а раз вставился в document, то сам браузер уже распарсил передаваемый текст и заменил все по своему усмотрению.
Тем более FF и IE отдают разные стринги.
Вот и вопрос, Как получить ответ сервера напрямую, без обработки при вставлении в document.
Сижу, инет перелапачиваю уже 3 день... и все без толку.
А в сорсах ajaxForm что-то разобраться не могу.
Заранее благодарен тому гуру кто в этом понимает.
|
|
10.12.2009, 20:57
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Что за бред? Никто никуда ничего не вставялет. Примените другой dataType, ато все-таки не особо похоже на хтмл то, что Вы получаете от сервера К примеру, dataType: 'json'. (Да, и емнип dataType != encoding)
|
|
11.12.2009, 00:03
|
Новичок на форуме
|
|
Регистрация: 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
|
|
11.12.2009, 01:00
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Просмотрел код. Попробуйте так: dataType: 'json', + передавайте с сервера свою строку, как value textarea. То еть ответ с сервера будет типа
<textarea>[\"<div height='34px' width=15px class=\\\"error\\\">По этому запросу ни чего не найдено.</div>\"]</textarea>
В этом случае плагин должен выбрать значение textarea и вернуть его в responseText.
|
|
11.12.2009, 03:38
|
Новичок на форуме
|
|
Регистрация: 10.12.2009
Сообщений: 7
|
|
После использования textarea получаю вот такую строку
Код:
|
<textarea>["<div height='34px' width=15px class=\"error\">По этому запросу ни чего не найдено.</div>"]</textarea> |
уже лучше, но тоже обработанную браузером. Похоже что при вставлении в тело документа он дизактивирует html код.
Решение своей проблемы нашел.
Перед отсылкой с сервера обрабатываю мою строку Html.Encode,
а после получения из iframe делаю Html.Decode
Хотя, может что нибудь вместо <textarea> попробовать, поэксперементировать. Что бы Encode/Decode не использовать.
Ведь после <textarea> можно Decode сделать и отсечь сам тэги с textarea, то получу требуемое... У меня много длинных стрингов передается, интересно какой способ из этих менее ресурсоёмчее
|
|
11.12.2009, 14:08
|
|
Профессор
|
|
Регистрация: 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>
Выводит без экранирования. Дайте ссылку на проблемную страничку, или реализуйте тестовую, которая описывает проблему.
|
|
11.12.2009, 20:17
|
Новичок на форуме
|
|
Регистрация: 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 расположенную в ифрейме получается проблема описанная выше.
|
|
11.12.2009, 20:26
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Так с innerHTML так и должно быть, вроде как. Смотрите не innerHTML, а
document.frames['ifr'].document.getElementsByTagName('textarea')[0].value
|
|
11.12.2009, 21:23
|
Новичок на форуме
|
|
Регистрация: 10.12.2009
Сообщений: 7
|
|
Точно. попробовал с
Код:
|
document.frames['ifr'].document.getElementsByTagName('textarea')[0].value |
стринга передается без изменений.
Спасибо!
Теперь надо попробовать в исходниках ajaxForm, исправить взятие данных из фрейма с innerHtml на value. А затем протестировать в моем приложении
Обязательно напишу, получилось ли это у меня
|
|
11.12.2009, 21:37
|
Новичок на форуме
|
|
Регистрация: 10.12.2009
Сообщений: 7
|
|
К удивлению быстро получилось в плугине поменять
Код:
|
с
xhr.responseText = doc.body ? doc.body.innerHTML : null;
на
xhr.responseText = doc.body ? doc.getElementsByTagName('textarea')[0].value : null; |
Все работае нормально. Но вот стоит ли мне переживать за кроссбраузерность этой замены. Разработчики ajaxForm наверно подумали об этом.
Просто вроде где-то читал, что getElementsByTagName не везде работает корректно.
Это так?
|
|
|
|