Ошибка в jquery.forms ? Помогите разобраться.
Страничка состоит из формы.
На форме все поля "обычные" - селекты, инпуты. И одно поле - для аплоада картинок. По сабмиту данные отсылаются и анализируется ответ в формате JSON. За обработку отвечает следующая функция: $(document).ready(function() { var my_success = function(resp, st) { ... } $("#my_form").submit(function() { set_varlen_data(); }); $("#my_form").ajaxForm({dataType: 'json', success: my_success}); }); собсно функция my_success обрабатывает ответ JSON. Так вот. Если вводятся все поля КРОМЕ картинки(её аплоада) - то посылается браузером "нормальный" запрос Заголовки запроса Host room404.no-ip.org:8081 User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Accept application/json, text/javascript, */* Accept-Language ru,en-us;q=0.7,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive 300 Connection keep-alive Content-Type application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With XMLHttpRequest Referer http://room404.no-ip.org:8081/input/ Content-Length 186 Cookie sessionid=ac0b8ea2b1598ae4f3650fde85a29f30 И получается нормальный ответ Заголовки ответа Date Sat, 15 Aug 2009 12:31:09 GMT Server WSGIServer/0.1 Python/2.6.2 Content-Type application/json Соответственно был запрошен json, он отработался в my_success и отрисовались либо сообщения об ошибке, либо всё как должно было быть. Если же среди данных есть ВВЕДЁННАЯ КАРТИНКА(на аплоад) - посылается "неправильный" запрос(почему- так и не понял. На дебаге застрял, пишу сюда....) Заголовки запроса Host room404.no-ip.org:8081 User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language ru,en-us;q=0.7,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive 300 Connection keep-alive Referer http://room404.no-ip.org:8081/input/ Cookie sessionid=ac0b8ea2b1598ae4f3650fde85a29f30 Но на сервере написано, что этой форме всё-равно нужно отдавать json, (она должна смочь обрабатывать json) - это можно заблокировать, но пока идёт отладка. Вообщем ситуация обычная. Заголовки ответа Date Sat, 15 Aug 2009 12:23:46 GMT Server WSGIServer/0.1 Python/2.6.2 Content-Type application/json Вот такой вот ответ. В следствие того, что сервер не интерпретирует(видимо) это как json - выскакивает окошко "сохранить файл, который является application/json" - а этот ответ должна была обработать функция my_success, забиндиная ajaxForm ещё в document.ready...... Одним словом - надо сделать так, чтобы и с картинкой работало. Т.е. чтобы и с картинкой запрашивался json.... И на него биндился my_success.... Где ошибка - ума не приложу... Вожусь уже 4й день. Гугл и форум никаких результатов не дал( |
Странно, на самом деле. Попробуйте вот так:
$("#my_form").ajaxForm( { dataType: 'json', success: my_success, beforeSend: function(xhr) { xhr.setRequestHeader("Accept", "application/json, text/javascript, */*"); return true; } } ); А вообще с application/json одни проблемы... |
Попробовал. Ничего не меняется, даже заголовки всё теже(
Может на document.ready ajaxForm ставится на форму, которая описывается в http без mime заголовков, но когда я вкладываю файл, то всё, что я забиндил анбиндится, ибо это уже форма с mime заголовками?... Но ведь это должно было быть предусмотрено... Может у кого ещё какие-нибудь соображения? |
Наконец-то додумался=) Заглянуть в консоль ошибок.
Если передаю форму обычным post-ом, то всё чисто. Если аплоадю файл - выдаётся следующая ошибка Ошибка: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIMIMEInfo.primaryExtension]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: chrome://dotnetassistant/content/contenttype.js :: anonymous :: line 44" data: no] у кого какие соображения по этому поводу? И главное, чего посоветуете делать? |
Цитата:
|
Удалил эксепшн-то исчез. Но это не он влиял( В эксплорере - то же самое...
|
Сидел в дебаге. Выяснил следующее.
Использую * jQuery Form Plugin * version: 2.18 (06-JAN-2009) * @requires jQuery v1.2.2 or later Сам jquery.form в 253 строчке устанавливает обработчик io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); Затем этот обработчик срабатывает и в 311 строчке передаёт управление ajaxSuccess.... Т.е. моей функции. В идеале всё должно работать так, как на http://spiritzzz.com/files/jquery_upload/ Но у меня толи обработчик не устанавливается, толи функции не передаётся управление. вообщем факт в том, что функция cb() даже не вызывается(которая вешается на 'load') ..... Вопрос. Почему она может не вызываться? Если она вызывается на вышеуказанной ссылке..... |
дело в том, что отправка файлов организуется с помощью скрытого фрейма, а не xmlhttprequest. А если попытаться загрузить в фрейм application/json, то появляется окно сохранения файла
1.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en"> <head> <title>title</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <form id="my_form" target="asd" action="1.php" enctype="multipart/form-data"> <input type="file" name="asd"> <input type="submit"> </form> <iframe name="asd" src="about:blank"></iframe> </body> </html> 1.php: <?php header( 'Content-Type: application/json' ); ?> {a: 123} |
Спасибо, уже разобрался) Только мне за незнанием матчасти пришлось для этого передебажить весь jQuery.forms )) Но всё-равно приятно. Одним словом, ошибка обнаружилась в jQuery.forms. Ибо параметр dataType можно ставить application/json - там этого нигде не проверяется насчёт совместимости с фреймой и отправкой файлов. А обидно, надеюсь в следующих релизах исправят. пока что отправляю хтмл, и потом его уже делаю evalJSON. Там ещё есть некоторое шаманство с этим связанное)
Но всё-равно спасибо. Приятно видеть, что всё-тки есть люди, знающие матчасть;) Теперь буду знать, к кому обратиться за помощью |
Цитата:
|
Часовой пояс GMT +3, время: 21:49. |