Делаю отправку формы на сервер посредством метода ajaxSubmit() вышеупомянутого плагина. Формы без элемента file работают отличненько. Результат возвращается в виде JSON-строки.
Проблемы возникают, когда на форму добавляется выбор файла. В шаблоне формы у меня автоматом появляется соответствующий enctype. Плагин все отправляет, результат приходит в нужном виде (смотрел через firebug). Первая проблема — браузер предлагает сохранить результат в виде файла. Погуглив, пришел к тому, что Content-Type ответа пришлось поменять с 'application/json; charset=UTF-8' на дефолтный 'text/html; charset=utf-8'.
Теперь ответ приходит «в студию», но success-функция не отрабатывает. Судя по всему, теперь затычка в формате ожидаемого результата — я ведь указывал опцию dataType: 'json'. Убрал опцию — success отрабатывает, но, судя по всему, плагин пытается сконвертировать результат в формат html, т.к. добавляются тэги типа HEAD и BODY. Причем firebug показывает, что изначальный результат приходил верный, т.е. это косяк именно плагина.
Кто-нибудь встречался с такими проблемами? Как их решать? Использую jQuery 1.4.2 (пробовал переключиться на 1.3.2 — те же грабли) и Form 2.5.1 (вроде как последняя версия).
Это связано с тем, что единственный кроссбраузерный метод загрузки файлов AJAX'ом — создать невидимый />и указать форме атрибут target=«upload».
Плагином этот ответ считывается только в виде текста.
Обязательно именно iframe? Почему обычный div не подходит? И еще, прочитал про обертывание результата в TEXTAREA — этот метод тоже не подходит? Вроде аналогичный по сути.
Сейчас попробовал — безо всяких невидимых фреймов все заработало — просто обернул результат в textarea. Видимо плагин автоматом умеет парсить такие ответы.
Насколько я помню проблема именно в firebug'е. Попробуйте с отключенным firebug'ом. Дело в том, ка уже было сказано выше, форма отсылается на iframe и плагин берет document.body.innerHTML, а наш любимый firebug добавляет пару своих дивов в iframe — json не валидный.
Есть способ через textarea или ответ возвращать не просто json, а json обернутый в «pre».
Но все дело в firebug'е, то есть есть человек инспектит ваш сайт через firebug, то у него работать не будет.
Значит какой-то другой плагин портит вам жизнь. Потому что, что textarea — это костыль по своей сути.
Плагин получает данные через doc.getElementsByTagName('textarea')[0].value или doc.getElementsByTagName('pre')[0].innerHTML или doc.body.innerHTML, где doc — это iframe document.
Так что, ломаться может, только в том случае если в ifram'e есть что-то лишнее.
Можно задебажить с помощью $.fn.ajaxSubmit.debug = true