jQuery ajaxForm возвращает файл .json

У меня есть форма создания модели в рельсах, которую я также возвращаю JSON через ajax. Мой код пока выглядит так:

$('#new_stem').ajaxForm({ //#new_stem is my form
  dataType: 'json',
  success: formSuccess
});

function formSuccess(stemObj) {
  //does stuff with stemObj
}

И у меня есть составная форма с загрузчиком файлов (но я не уверен, что это актуально).

Когда я отправляю форму, она работает нормально (мои модели правильно создаются и отображаются как json), но вместо того, чтобы json обрабатывался функцией formSuccess, она запрашивает загрузку для "stems.json" (путь к моему созданию основы действие) в Firefox.

Что могло бы вызвать это и что могло бы решить эту проблему? Не уверен, что это часть проблемы, но у меня нет кнопки отправки в моей форме, у меня есть ссылка с обработчиком кликов, который вызывает $ ('# new_stem) .submit ()

Спасибо ребята!

РЕДАКТИРОВАТЬ: Firebug сообщает мне, что заголовок содержит следующее:

Etag        "b53e5247e7719cf6b1840e2c6e68781c"
Connection      Keep-Alive
Content-Type    application/json; charset=utf-8
Date        Mon, 03 May 2010 02:19:31 GMT
Server      WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)
X-Runtime       241570
Content-Length  265
Cache-Control   private, max-age=0, must-revalidate

плюс заголовок cookie


person Lowgain    schedule 03.05.2010    source источник
comment
Я думаю, что это связано с аспектом загрузки файлов. Если я перейду непосредственно к файлу json с помощью Firefox, откроется та же подсказка, и я знаю, что для загрузки файла через ajax необходимо создать отдельный iframe, который отправляет форму. Я думаю, что iframe просто переходит к этому json-файлу впоследствии, а firefox пытается обработать его как загрузку. Могу ли я изменить какие-либо параметры на стороне сервера, чтобы заставить его думать, что это не загрузка?   -  person Lowgain    schedule 03.05.2010


Ответы (8)


Чтобы браузер не запускал загрузку файла .json, установите для заголовка Content-type значение «text / html».

PHP:

header("Content-type: text/html");

ASP.NET MVC:

return Json(obj, "text/html");

В javascript вам нужно проанализировать текстовый результат, например:

$(".addform").ajaxSubmit({
            url: "file.php",
            type: "POST",
            dataType: "text",
            iframe: true,
            success: function (text) {
                var data = $.parseJSON(text);
            },
            error: function (xmlRequest, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });

Прекрасно работает.

person Ondrej Petrzilka    schedule 09.08.2010
comment
Это вызовет проблемы, если ваш ответ будет содержать символ < (или & в некоторых случаях), поскольку анализатор HTML правильно исправит некоторые ошибки. - person user123444555621; 03.03.2011

Хотя это не совсем то, что я хотел решить, я смог прийти к немного другому решению, которое соответствовало моим потребностям!

Поскольку загрузка файлов ajax выполняется через iframe, проблема заключалась в том, что после того, как iframe загрузил файл .json, Firefox интерпретировал его как загрузку, и было открыто приглашение загрузки. Я почти уверен, что мог бы поиграть с некоторыми настройками сервера, чтобы предотвратить это, но я уже потратил на это достаточно времени.

Итак, то, что я сделал, было визуализировано как текст вместо json, потому что я все равно ловил только один номер идентификатора. Теперь мой код выглядит так:

$(document).ready(function() {
  $('#continue-upload').click(function() {
    $('#new_stem').ajaxSubmit({
      dataType: 'text', //'json',
      success: formSuccess
    });
  });
});

Идентификационный номер, который мне был нужен, также был заключен в предварительные теги, поэтому мне также нужно было удалить их в моей функции результатов.

Это делает то, что я хочу сейчас, у-у!

person Lowgain    schedule 03.05.2010

На самом деле код ajaxSubmit для этого плагина немного взломан. Чтобы заставить ajaxSubmit работать (на момент написания), ваш сервер должен возвращать данные JSON как content-type = text / html. Плагин автоматически удалит теги ‹\ pre> и т. Д. (См. Исходный код). Я думаю, когда они пытались получить скрытый iframe, чтобы вытащить json, они решили обработать json текст и проанализировать его с iframe.

person trcarden    schedule 06.01.2011

Этот плагин позволит вам отправлять многостраничные формы с помощью ajax.

Если вы хотите использовать опцию Ajax «success:», вам необходимо отправить форму с помощью ajax. В настоящее время вы используете функцию submit (), которая в основном просто отправляет форму традиционным способом. Тот факт, что вы можете видеть данные json в виде загруженного файла или в своих браузерах, означает, что это происходит.

Вам нужно использовать этот плагин (если вам нужна функция multipart - в противном случае просто используйте обычную функцию Ajax)

С плагином вы бы использовали его так:

$("#SubmitButton").click(function() {

  $.ajaxFileUpload({
    url: serverurl,
    secureuri: false,
    fileElementId: elementId,
    dataType: 'json',
    success: function(data, status) {
      /* show success message */
    },
    error: function(data, status, e) {
      /* handle error */
    }
  });
});

Если вы хотите сделать это без загрузки файла, есть более простой способ сделать это.

$("#SubmitButton").click(function() {
  $.post('YOUR_URL', $("#FormName").serialize(), function(data) {
    alert(data.name); // John
  }, "json"); //specify return data is going to be json
});
person DMin    schedule 03.05.2010
comment
плагин ajaxForm позволяет загружать файлы, и они успешно выполняются. Я считаю, что он также подключается к событию .submit (), но я изменил свой обработчик кликов, чтобы вместо этого вызывать .ajaxSubmit (). К сожалению, те же результаты! - person Lowgain; 03.05.2010
comment
собираюсь попробовать и этот плагин! - person Lowgain; 03.05.2010
comment
Не похоже, что этот плагин дает мне какой-либо контроль над структурой моих данных поста. Так как это рельсы, его нужно пересылать определенным образом. - person Lowgain; 03.05.2010
comment
проверьте: stackoverflow.com/questions/670320/ - Используя $ ('# frmSearch'). bind, этот человек смог заставить работать то же самое. Правильный ответ читайте на странице. если вы используете ajaxSubmit, надеюсь, вы также используете - jQuery Form Plugin (jquery.malsup.com/form) вместе с ним. - person DMin; 03.05.2010
comment
Теперь мне кажется, что отправка не является проблемой, но Firefox обрабатывает возвращаемый файл .json, как если бы это была загрузка (поскольку загрузка ajax выполняется через iframe). Мне нужно придумать способ заставить firefox открывать его в браузере вместо загрузки - person Lowgain; 03.05.2010
comment
file-extensions.org/ Расширение файла Описание JSON: Расширение файла .json используется веб-браузером Mozilla Firefox. Используется Mozilla Firefox версии 3.0 для резервного копирования закладок в формате JSON. используя php, я обычно просто выводил бы правильную строку в формате json с обычной страницы php с расширением .php, а jquery без проблем принимает ее и обрабатывает как json. - person DMin; 03.05.2010

Похоже, заголовок ответа Content-Type неверен, и поэтому браузер не знает, что с ним делать. Это должно быть application/json. Вы можете использовать панель Net Firebug для определения фактических заголовков ответов.

person BalusC    schedule 03.05.2010
comment
Я просмотрел входящие заголовки с помощью firebug, который содержит Content-Type application / json; charset = utf-8 - person Lowgain; 03.05.2010
comment
Хорошо, я бы обновил вопрос, включив это ... Это одно из первых, о чем можно подумать, когда неожиданно появляется запрос на загрузку. Как насчет Content-Disposition? Нет attachment? - person BalusC; 03.05.2010
comment
Заголовки выглядят нормально. Я сделаю снимок в темноте: а если вы измените dataType на jsonp? Однако обычно это используется только для междоменных запросов JSON, но это меняет способ обработки JSON. - person BalusC; 03.05.2010
comment
не похоже, что ajaxForm поддерживает jsonp - person Lowgain; 03.05.2010
comment
Наконец, вы исправили это, изменив с dataType на text. Я нахожу это довольно странным. Как насчет других браузеров? Разве это не проблема конфигурации Firefox? - person BalusC; 03.05.2010

Вы отменяете действие по умолчанию для события submit? Похоже, что форма на самом деле отправляется (другими словами, в классическом смысле Firefox переходит на страницу, указанную в action формы).

person josh3736    schedule 03.05.2010
comment
Насколько мне известно, ajaxForm уже позаботились об этом. - person BalusC; 03.05.2010
comment
Ах, я никогда не использовал ajaxForm. Возможно, запустите Fiddler, чтобы узнать, генерируются ли несколько запросов? - person josh3736; 03.05.2010

Может это поможет

$('#cpFileUpload').ajaxForm({
        dataType: 'html',           
        success: function(data) {           
            eval(data);                 
            if (data.result == false) {
                alert('error on server side');
            } else {                
                // do what you want
            }
        }       
    }); 

И на стороне сервера вывод должен быть таким (только этот вывод или без какого-либо другого текста внутри тега тела)

var data = {result: true, html: 'ok'}

Не очень приятно, но работает

person ifrond    schedule 20.06.2010

Простой способ:

$('#new_stem').ajaxForm({ dataType: 'text', complete: function(xhr) { data = JSON.parse(xhr.responseText); } });

person Boy Suro    schedule 09.10.2018