Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   ajaxSubmit - проблема с получением ответа в success в опера и IE (https://javascript.ru/forum/jquery/36427-ajaxsubmit-problema-s-polucheniem-otveta-v-success-v-opera-i-ie.html)

amelinviacheslav 14.03.2013 20:32

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 и опере при получении ответа с сервера появляется окошко загрузки файла (картинка из IE в опере аналогично) и чтоб я не выбрал: открыть сохранить отменить - alert ('123132132'); не наступает.
Ответ - простая строка. dataType попробовал все значения, но не помогло - загрузка файла. А сам загружаемый файл и содержит как раз таки нужную строку (я его сохранял как txt).

Вот и возник вопрос - как сделать так чтоб я получал строку строкой и браузеры не думали что им суют файл на загрузку....
Может найдется добрая душа и направит на путь истинный.:help:

Hoshinokoe 14.03.2013 21:16

amelinviacheslav,

Попробуйте выставить правильный Сontent type на сервере.

amelinviacheslav 14.03.2013 21:24

все бы хорошо, но сервер не мой - и что и как там реализовано неизвестно. сервер - uploads.ru. что и как они посылают....можно только догадываться....

devote 14.03.2013 21:36

Цитата:

Сообщение от amelinviacheslav
можно только догадываться....

гадать не надо, достаточно открыть отладчик в браузере и посмотреть заголовки ответа.

amelinviacheslav 15.03.2013 07:01

так я же методом научного тыка перебрал все дататайпы и всеравно просит закачку файла. до обработки в success не доходит.
в ответ приходит просто текст! и я его запросто обрабатываю, но меня бесит что он из-за закачки просто не доходит. вот я и в ступоре - как убрать закачку файла и оставить только ответ сервера в обработчике.

danik.js 15.03.2013 08:40

Цитата:

Сообщение от amelinviacheslav
в ответ приходит просто текст

Это не так. Помимо тела ответа, есть еще заголовки, о которых сказал devote
Например Content-Disposition, который если выставлен как attachment, то браузер предложит сохранить файл. Правда как это будет работать в условиях XHR-запроса я не в курсе)

amelinviacheslav 15.03.2013 11:15

Даник, спасибо за ответ!Devote - спасибо за направление поиска!!
Попробую конечно покопаться в этом направлении....
Но получается придется отлаживать на уровне файла jquery.js - т.к. получение ответа с в\сервера приходит где-то там....т.е. если я обрежу все лишние заголовки то должно по идее наступить счастье))) а т.к. используется аякс только 1 раз на этом скрипте то можно безболезненно править оригинал....
Попробую разобраться!! Отладка спасет мир и взломает очень многое!!)))

самое интересное - на самых свежих версиях jquery и jqueryform ответ не приходил в принципе - в опере и ИЕ вообще никакой реакции. по наводке кого то на форуме скачал версии подревнее - jquery 1.6.2 и все заработало без правки скриптов....странно но факт....но это не тема данной ветки а просто информация для размышления.

Ребята, а маленький офтоп - в фаербаге посмотреть ответ могу, но в опере в драконфлае и в ИЕ во встроенном отладчике не знаю куда давить.

danik.js 15.03.2013 12:37

вкладка Сеть (Network) есть везде.

amelinviacheslav 15.03.2013 14:45

Понял. Вечером как только доберусь до проекта попробую.

amelinviacheslav 15.03.2013 21:44

попробовал посмотреть заголовки ответа
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

danik.js 15.03.2013 22:11

А зачем ajaxSubmit?
Почему не просто $.ajax или $.post ?

amelinviacheslav 15.03.2013 22:57

основу скрипта писал другой человек и я не могу сказать почему он выбрал именно такой подход. Он все отлаживал в фаерфоксе - поэтому остальные браузеры остались не у дел, а мне теперь надо довести скрипт до ума. в основном скрипте есть два обращения к серверу: через ajaxSubmit и через $.ajax. $.ajax - не работает в ИЕ и опере в принципе - пока что не трассировал, но гдето видно есть заморочки. ajaxSubmit - заработал почти полностью - вот и решил его довести до ума.
только что посмотрел ответ на запрос через $.ajax - как и ожидалось - один в один как и при запросе через ajaxSubmit.

Как я понимаю даже если я буду использовать $.ajax или $.post то при абсолютно аналогично ответе как сейчас картина не изменится и всеравно прийдется искать как обойти загрузку файла....

danik.js 15.03.2013 23:11

Мне вот кажется что ajaxSubmit испольузет iframe для запроса. Отсюда и беды. Сделайте небольшой тестовый js-скрипт + сценарий на сервере, возвращающий json, и разрещающий кроссдоменные запросы.

amelinviacheslav 15.03.2013 23:28

насколько я помню ajaxSubmit при создании формы делает чтото с iframe.
Спасибо за идею! Сейчас попробую в "голом" аяксе

amelinviacheslav 16.03.2013 00:25

а голый аякс сработал)))) все пришло в нужном формате и без рудиментов))) теперь только парсер ответа в ИЕ выделывается - но это уже не проблема.
danik.js - именно так как Вы говорили и получилось! Спасибо огромное!

Т.е. если есть проблемы - чем меньше надстроек тем лучше!
Тему можно закрывать!

amelinviacheslav 16.03.2013 21:10

Рано обрадовался.
Смысл изначального скрипта был в отправке файла, а это возможно только в 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"}}

вот корректный ответ сервера.
Может быть будут идеи как его не "загружать файлом"

danik.js 16.03.2013 21:21

Цитата:

Сообщение от amelinviacheslav
голый аякс просто так это не делает

XMLHttpRequestUpload делает. Но его нет в старых браузерах. Это не проблема? Хотя вобще не знаю подойдет ли он вам. Если есть возможность - выставьте на сервисе mimeType text/plain, думаю это поможет с iframe'ом

amelinviacheslav 17.03.2013 10:31

Так вот и дилема теперь - можно отрезать старые браузеры и работать только с новыми (хотя старых все меньше и меньше.....) к сожалению к сервису доступа нету - это фотообменник.

danik.js 17.03.2013 11:26

Раз форма отправляется на чужой домен, то как вы прочитаете ответ? Политика безопасности этого же не позволит.

devote 17.03.2013 15:36

Цитата:

Сообщение от danik.js
Политика безопасности этого же не позволит.

Цитата:

Сообщение от amelinviacheslav
Access-Control-Allow-Origin: *

этот заголовок позволит читать

danik.js 17.03.2013 15:57

devote, так ajaxSubmit сабмитит файл через iframe. Я вобще непонимаю как у автора где-то это работает.

amelinviacheslav 17.03.2013 21:36

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-у. Все работает. но вот только не до конца.

blormik 15.01.2014 17:31

И если не секрет чем все закончилось?

loveaboveall 29.03.2014 12:45

Всем здравствуйте. У меня таже самая проблема! Тема так и не закончена , каков результат? что делать в данном случае? Очень хочеться передвать файлы именно AJAX технологией без перезагрузки страницы


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