Ошибка ответа Ajax и JSON в Internet Explorer (работает во всех других браузерах) - PullRequest
6 голосов
/ 01 сентября 2010

По какой-то причине IE просит нас загрузить файл вместо того, чтобы запускать его как ajax. Это работает во всех браузерах, кроме IE. Я попытался возиться с заголовками, которые он возвращает, но безуспешно.

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

Он не должен быть файлом, он должен быть просто ответом json.

PHP

header('Content-type: application/json');

$error = "The Email and Password you entered could not be resolved.";
$elements[0]['target'] = '.error_report';
$elements[0]['action'] = 'inside';
$elements[0]['data'] = '<p>'.$error.'</p>';
$this->output->set_output(
  json_encode(array("elements" => $elements))
);

1010 * Javascript *

$(document).ready(function () {
    jQuery.ajaxSetup({
        cache: false,
        dataType: 'json',
        error: function () {
            alert("Request was not successful. Please try again shortly.");
        }
    });

    $(document).ajaxSuccess(function (e, xhr, settings) {
        var response = xhr.responseText;
        if (settings.dataType != 'json') {
            return;
        };

        try {
            response = jQuery.parseJSON(response);
        } catch (e) {
            alert(e);
            return;
        }

        if (response.elements instanceof Array) {
            var reqs = ['target', 'action'];
            var valid = true;
            for (var i=0;i<response.elements.length;i++) {
                var cur = response.elements[i];
                var sel;

                for (var j=0;j<reqs.length;j++) {
                    if (typeof cur[reqs[j]] !== "string") {
                        valid = false;
                        break;
                    };
                };

                if (!valid) {
                    continue;
                };

                sel = $(cur.target);
                switch (cur.action) {
                    case "inside":
                        sel.html(cur.data);
                    break;
                    case "instead":
                        sel.replaceWith(cur.data);
                    break;
                    case "remove":
                        sel.remove();
                    break;
                    case "refreshPage":
                        window.location.reload();
                    default:
                        if (typeof sel[cur.action] === "function") {
                            sel[cur.action](cur.data);
                        }; // else continue
                    break;
                };
            };
        };


            // Dispatch the AJAX request, and save it to the data object so that
            // is can be referenced and cancelled if need be.

            self.data('ajaxify.xhr', jQuery.ajax({
                url: this.action,
                type: 'post',
                dataType: options.dataType,
                data: (beforeSubmitIsJquery ? beforeSubmitResult.serialize()
                                            : self.serialize()),
                success: function (/**/) {
                    cleanup();

                    options.onSuccess.apply(that, arguments);
                },
                error: function (/**/) {
                    cleanup();

                    options.onError.apply(that, arguments);
                },
                complete: function (/**/) {
                    options.onComplete.apply(that, arguments);
                }
            }));

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Ну, я спрашиваю, потому что описываемое вами поведение имеет все признаки двойного поста, вызванные обработчиком событий, запускающим запрос ajax с последующей отправкой «родной» формы браузера. На вашем месте я бы сделал тройную дополнительную уверенность в том, что ваш обработчик событий либо возвращает «false», либо вызывает «protectDefault», либо, может быть, оба :-) - Pointy 1 час назад

Мое продолжение: Так как IE игнорирует предотвращение появления ошибок, попробуйте использовать return false; после protectDefault ...

Для будущей ссылки на других разработчиков: способ, которым обычные библиотеки стремятся это сделать, заключается в том, что они обычно кодируют блок обоими методами (protectDefault () и возвращают false;), поскольку это говорит каждому из основных браузеров прекратить работу событие, согласно которому они слушают. Это более важно в старых браузерах IE.

В любом случае, рад, что мы могли помочь.

0 голосов
/ 13 июля 2012

У меня была эта проблема с ASP.NET MVC 4. Я возвращал JSONResult. Но путем изменения возвращаемого объекта на this.content эта проблема была исправлена.

[HttpPost]
public ActionResult Upload(AddNewModel model)
{
    /**...*/
    return this.Content(id.ToString());
}

Похоже, что у IE есть проблема с возвращаемым объектом json, и ее можно исправить, вернув строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...