ajaxSubmit - проблема с получением ответа в success в опера и IE
Здравствуйте!
Я не самый продвинутый явовщик, но жизнь заставила разбираться. Проблема у меня одним местом чую элементарная, но за три дня лазанья по инету ничего не понял. Есть скрипт: $(function() {var options = {url: 'урл', type: 'POST', //dataType: 'text', data: { данные }, success: function( responseText, statusText, xhr ) { alert ('123132132'); ); error: function(textStatus) { alert( textStatus ); }, complete: function() { alert( 'complete' ); } $( form ).ajaxSubmit( options ); за код сильно не бейте - сокращал для форума на вскидку и мог накосячить с правильностью, но не в этом главное. В целом классический скрипт. В фаерфоксе все работает отлично - приходит ответ, я получаю alert ('123132132');. а вот в ie8 и опере при получении ответа с сервера появляется окошко загрузки файла ![]() Ответ - простая строка. dataType попробовал все значения, но не помогло - загрузка файла. А сам загружаемый файл и содержит как раз таки нужную строку (я его сохранял как txt). Вот и возник вопрос - как сделать так чтоб я получал строку строкой и браузеры не думали что им суют файл на загрузку.... Может найдется добрая душа и направит на путь истинный.:help: |
amelinviacheslav,
Попробуйте выставить правильный Сontent type на сервере. |
все бы хорошо, но сервер не мой - и что и как там реализовано неизвестно. сервер - uploads.ru. что и как они посылают....можно только догадываться....
|
Цитата:
|
так я же методом научного тыка перебрал все дататайпы и всеравно просит закачку файла. до обработки в success не доходит.
в ответ приходит просто текст! и я его запросто обрабатываю, но меня бесит что он из-за закачки просто не доходит. вот я и в ступоре - как убрать закачку файла и оставить только ответ сервера в обработчике. |
Цитата:
Например Content-Disposition, который если выставлен как attachment, то браузер предложит сохранить файл. Правда как это будет работать в условиях XHR-запроса я не в курсе) |
Даник, спасибо за ответ!Devote - спасибо за направление поиска!!
Попробую конечно покопаться в этом направлении.... Но получается придется отлаживать на уровне файла jquery.js - т.к. получение ответа с в\сервера приходит где-то там....т.е. если я обрежу все лишние заголовки то должно по идее наступить счастье))) а т.к. используется аякс только 1 раз на этом скрипте то можно безболезненно править оригинал.... Попробую разобраться!! Отладка спасет мир и взломает очень многое!!))) самое интересное - на самых свежих версиях jquery и jqueryform ответ не приходил в принципе - в опере и ИЕ вообще никакой реакции. по наводке кого то на форуме скачал версии подревнее - jquery 1.6.2 и все заработало без правки скриптов....странно но факт....но это не тема данной ветки а просто информация для размышления. Ребята, а маленький офтоп - в фаербаге посмотреть ответ могу, но в опере в драконфлае и в ИЕ во встроенном отладчике не знаю куда давить. |
вкладка Сеть (Network) есть везде.
|
Понял. Вечером как только доберусь до проекта попробую.
|
попробовал посмотреть заголовки ответа
HTTP/1.1 200 OK Server: nginx Date: Fri, 15 Mar 2013 17:39:56 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 441 Connection: keep-alive Last-Modified: Fri, 15 Mar 2013 17:39:57GMT Cache-Control: no-cache, must-revalidate Pragma: no-cache Access-Control-Allow-Origin: * {"status_code":200,"status_txt":"OK","data":{"img_name":"89uwf.jpg","img_url":"http:\/\/s2.uploads.ru\/89uwf.jpg","img_view":"http:\/\/uploads.ru\/89uwf.jpg","img_width":"390","img_height":"293","img_attr":"width=\"390\" height=\"293\"","img_size":"27.1 KB","img_bytes":27792,"thumb_url":"http:\/\/s2.uploads.ru\/t\/89uwf.jpg","thumb_width":100,"thumb_height":75,"source":"base64 image string","resized":"1","delete_key":"fed6df71df55f710"}} как я понял тип данных ответа Content-Type: application/json; charset=UTF-8 и как понимаю application это и есть та бяка изза которой начинается скачивание файла.... В апи сервера нашел как выставить в параметрах запроса тип ожидаемого ответа, но как только тип JSON меняю на другой (txt или xml) опера и ИЕ снова перестают отрабатывать success. буду пробовать отлаживать jquery.js |
А зачем ajaxSubmit?
Почему не просто $.ajax или $.post ? |
основу скрипта писал другой человек и я не могу сказать почему он выбрал именно такой подход. Он все отлаживал в фаерфоксе - поэтому остальные браузеры остались не у дел, а мне теперь надо довести скрипт до ума. в основном скрипте есть два обращения к серверу: через ajaxSubmit и через $.ajax. $.ajax - не работает в ИЕ и опере в принципе - пока что не трассировал, но гдето видно есть заморочки. ajaxSubmit - заработал почти полностью - вот и решил его довести до ума.
только что посмотрел ответ на запрос через $.ajax - как и ожидалось - один в один как и при запросе через ajaxSubmit. Как я понимаю даже если я буду использовать $.ajax или $.post то при абсолютно аналогично ответе как сейчас картина не изменится и всеравно прийдется искать как обойти загрузку файла.... |
Мне вот кажется что ajaxSubmit испольузет iframe для запроса. Отсюда и беды. Сделайте небольшой тестовый js-скрипт + сценарий на сервере, возвращающий json, и разрещающий кроссдоменные запросы.
|
насколько я помню ajaxSubmit при создании формы делает чтото с iframe.
Спасибо за идею! Сейчас попробую в "голом" аяксе |
а голый аякс сработал)))) все пришло в нужном формате и без рудиментов))) теперь только парсер ответа в ИЕ выделывается - но это уже не проблема.
danik.js - именно так как Вы говорили и получилось! Спасибо огромное! Т.е. если есть проблемы - чем меньше надстроек тем лучше! Тему можно закрывать! |
Рано обрадовался.
Смысл изначального скрипта был в отправке файла, а это возможно только в iframe. голый аякс просто так это не делает, соответственно как раз ajaxSubmit и создает нужную обертку. вот и получается что вопрос возникает снова - при получении ответа снова загрузка файла.((((( HTTP/1.1 200 OK Server: nginx Date: Sat, 16 Mar 2013 17:08:58 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 441 Connection: keep-alive Last-Modified: Sat, 16 Mar 2013 17:08:58GMT Cache-Control: no-cache, must-revalidate Pragma: no-cache Access-Control-Allow-Origin: * {"status_code":200,"status_txt":"OK","data":{"img_name":"lRT1E.jpg","img_url":"http:\/\/s2.uploads.ru\/lRT1E.jpg","img_view":"http:\/\/uploads.ru\/lRT1E.jpg","img_width":"390","img_height":"293","img_attr":"width=\"390\" height=\"293\"","img_size":"27.1 KB","img_bytes":27792,"thumb_url":"http:\/\/s2.uploads.ru\/t\/lRT1E.jpg","thumb_width":100,"thumb_height":75,"source":"base64 image string","resized":"1","delete_key":"bd27ce5a84872e7e"}} вот корректный ответ сервера. Может быть будут идеи как его не "загружать файлом" |
Цитата:
|
Так вот и дилема теперь - можно отрезать старые браузеры и работать только с новыми (хотя старых все меньше и меньше.....) к сожалению к сервису доступа нету - это фотообменник.
|
Раз форма отправляется на чужой домен, то как вы прочитаете ответ? Политика безопасности этого же не позволит.
|
Цитата:
Цитата:
|
devote, так ajaxSubmit сабмитит файл через iframe. Я вобще непонимаю как у автора где-то это работает.
|
var form = this.getInputElement().getParent().$, plugin_path = CKEDITOR.plugins.getPath( 'imgsave' ), dialog = this; CKEDITOR.scriptLoader.load( plugin_path + 'jquery.js', function() { CKEDITOR.scriptLoader.load( plugin_path + 'jquery.form.js', function() { $(function() { var options = { url: 'http://uploads.ru/api?upload', type: 'POST', dataType: 'json', //async: false, data: { thumb_width: 100, resize_width: editor.config.imageWidth,format:'JSON(P)' }, beforeSubmit: function( formData, jqForm, options ) { dialog.getElement().setStyle( 'display', 'none' ); dialog.getDialog().getContentElement( 'Upload', 'messages' ).getElement().setStyle( 'display', 'none' ); dialog.getDialog().getContentElement( 'Upload', 'loader' ).getElement().setStyle( 'display', '' ); return true; }, success: function( responseText, statusText, xhr ) { alert ('123132132'); var data_json; if ( toString.call( responseText ) !== "[object Object]" ) { data_json = JSON.parse( responseText ); } else { data_json = responseText; } if ( data_json[ 'status_txt' ] != 'OK' ) { dialog.getDialog().getContentElement( 'Upload', 'messages' ).getElement().setHtml( data_json[ 'status_txt' ] ); dialog.getDialog().getContentElement( 'Upload', 'messages' ).getElement().setStyle( 'display', '' ); return false; } $.each( data_json, function( q, w ) { if( q == 'data' ) { dialog.getDialog().getContentElement( 'Upload', 'preview' ).getElement().setAttribute( 'src', w.thumb_url ); dialog.getDialog().getContentElement( 'Upload', 'urlImage' ).setValue(w.img_url); } }); }, error: function(textStatus) { alert( textStatus ); }, complete: function() { dialog.getDialog().getContentElement( 'Upload', 'loader' ).getElement().setStyle( 'display', 'none' ); dialog.getDialog().getContentElement( 'Upload', 'preview' ).getElement().setStyle( 'display', '' ); } }; $( form ).ajaxSubmit( options ); return false; }); }); }); вот рабочий кусок скрипта по загрузке изображений на сервер uploads.ru на фаерфоксе работает вообщ без проблем. тут как раз и отправляется полностью форма с файлом. скрипт является частью плагина к CKEditor-у. Все работает. но вот только не до конца. |
И если не секрет чем все закончилось?
|
Всем здравствуйте. У меня таже самая проблема! Тема так и не закончена , каков результат? что делать в данном случае? Очень хочеться передвать файлы именно AJAX технологией без перезагрузки страницы
|
Часовой пояс GMT +3, время: 06:58. |