Кросс-браузер AJAX и setTimeout() работают в IE, но не работают в Chrome/Firefox

139
11

ОК. Это уже несколько дней разочаровывает меня. Я уверен, что я идиот, и есть решение прямо перед моим лицом, но вот мой вопрос.

У меня есть серия вызовов AJAX, которые обрабатывают и сохраняют данные с веб-страницы при нажатии кнопки "Сохранить". Это работало в IE уже много лет (была установка до того, как я был нанят), и у меня не было проблем. Теперь у нас есть требование поддерживать несколько браузеров, а именно IE, Firefox, Chrome и Safari.

То, что я вижу, когда пытаюсь нажать кнопку сохранения в Firebug, заключается в том, что я получаю первый вызов AJAX, я получаю ответ 200OK и время, затрачиваемое на ms, однако он продолжает вращаться:

Continues to spin forever
17 секунд - это то, что я прошел через код на стороне сервера.

Метод обработчика успеха AJAX никогда не называется, и все это разваливается. Я пробовал несколько разных методов, которые я нашел, но ни один из них не имеет большого значения. Вот исходный код.

EDIT 5: Вот обновленный код. Я упростил его и вынул метод Step() и все таймауты. Это просто вызов AJAX, который вызывает проблему.

    function SubmitForm() {
$.blockUI({ message: waitMessage, css: { padding: 5} });

var settingsXml = GetSettingsXml();
ajaxParameters = "customerId:'" + customerId + "', connectionId:" + connectionId + ", settingsXml:'" + settingsXml + "', securityToken:'" + securityToken + "'";

AjaxCall("EmailMarketingSettings.aspx", "Validate", ajaxParameters, function (result) {
alert("It works!")
}, function (result) {
alert("It broken!");
});
}

Validate() выполнит его в оператор return, но код никогда не вернется к успешному методу на стороне клиента.

Что мне не хватает?

EDIT: Вот запрошенный метод AjaxCall.

function AjaxCall(pageName, methodName, parameters, onSuccessCallback, onFailureCallback) {
$.ajax({
type: "POST",
url: pageName + "/" + methodName,
data: "{" + parameters + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
timeout: 120000,
success: function (resp) {
result = resp.d;
if (result.Success) {
if (onSuccessCallback != null && typeof (onSuccessCallback) == "function") {
onSuccessCallback(result);
} else {
$.unblockUI();
}
} else if (onFailureCallback != null && typeof (onFailureCallback) == "function") {
onFailureCallback(result.Message);
} else {
alert(result.Message);
$.unblockUI();
}
},
error: function (req, errorType, errorThrown) {
var errorMessage = "";
if (errorType == "timeout") {
errorMessage = "A timeout has occured"
} else if (req.responseText.length > 0) {
errorMessage = (req.responseText.substring(0, 1) == "{" ? eval("(" + req.responseText + ")").Message : req.responseText);
} else {
errorMessage = req.status;
}
if (onFailureCallback != null && typeof (onFailureCallback) == "function") {
onFailureCallback(errorMessage);
} else {
alert("An error has occured: " + errorMessage);
$.unblockUI();
}
}
});
}

EDIT 2: Как только запрос отправлен, я удаляю обработчик ошибок, прежде чем мой код на стороне сервера вернет что-либо вообще. Вызов AJAX не ждет, когда что-то будет возвращено, просто вычеркивание ошибки с помощью ошибки "ошибка" и пустая строка для errorThrown.

РЕДАКТИРОВАТЬ 3: Сырые данные от Fiddler

Fire Fox:

HTTP/1.1 200 OK Cache-Control: private, max-age = 0 Content-Type: application/json; charset = utf-8 Сервер: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Дата: ср, 31 окт 2012 15:30:01 GMT Content-Length: 178

{ "D": { "__ типа": "CoreMotives.Web.MethodResult", "Успех": правда, "Комментарии": "", "Сообщение": "", "ElapsedMilliseconds": 0, "субтестов": нулевой, "NextStepAdditionalParameters": нулевой, "значение": NULL}}

IE:

HTTP/1.1 200 OK Cache-Control: private, max-age = 0 Content-Type: application/json; charset = utf-8 Сервер: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Дата: ср, 31 окт 2012 15:29:53 GMT Content-Length: 178

{ "D": { "__ типа": "CoreMotives.Web.MethodResult", "Успех": правда, "Комментарии": "", "Сообщение": "", "ElapsedMilliseconds": 0, "субтестов": нулевой, "NextStepAdditionalParameters": нулевой, "значение": NULL}}

Опять же. Вызов AJAX обращается к обработчику ошибок до того, как код на стороне сервера вообще что-то возвращает.

Редактировать 4: Ссылка на файл.saz от Fiddler. http://tinyurl.com/ckmatsk

Там должно быть только 2 записи.

спросил(а) 2021-01-25T22:24:31+03:00 4 месяца, 3 недели назад
1
Решение
89

Вау... Все эти усилия для чего-то такого глупого...

Я понял, что моя проблема была благодаря этой теме: JQuery Ajax Firefox Error

Метод SubmitForm() не возвращал false, так что поведение браузеров по умолчанию захватывало. Как только я изменил onclick на:

onclick = "return SubmitForm();"

из:

OnClick = "SubmitForm();"

И сделал SubmitForm() return false. Он начал работать как в Chrome, так и в Firefox.

Спасибо всем, кто смотрел на него. Надеюсь, это поможет кому-то в будущем, хотя я сомневаюсь, что многие такие глупые, как я...

ответил(а) 2021-01-25T22:24:31+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема