Michael Breeden Ответов: 1

После вызова jquery AJAX я не могу включить ввод текста.


ГАДЮКА.Net app использует JQuery AJAX. Перед вызовом AJAX я могу обновить ввод в текстовом поле, но после вызова AJAX он кажется полностью отключенным, не позволяя редактировать текстовое поле, но другие элементы управления (флажок, кнопки, datepicker) все еще включены.
Обратите внимание, что в конце in .complete я добавил строку, чтобы попытаться принудительно включить ее, но это не помогло:
$('#idtxtLoggingDaysDisplayed').prop('disabled', false);
Любые предложения будут очень признательны. Спасибо, Майк


$.ajax({
    type: "POST",
    url: "GC_UserErrors.aspx/receiveAJAXMessage",
    data: sMsg1,
    beforeSend: function () {
        $(document).keydown(function () { return false; }); // disable keyboard input
        $(".overlay").show(); // show loader
        $('#loadingGIF').show();
    },
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    complete: function () {
        $(document).keydown(function () { return true; }); // enable keyboard
        $(".overlay").hide(); //hide loader
        $('#loadingGIF').hide();
        $('#idtxtLoggingDaysDisplayed').prop('disabled', false);
    },
    success: OnSuccess,
    failure: //function (response) {
        OnFailure
});


Что я уже пробовал:

Также пробовать
$('#idtxtLoggingDaysDisplayed').attr('disabled', false);

MadMyche

Какие-либо ошибки выбрасываются/отображаются в консоли разработчика браузеров? (например, огненный жук)

Michael Breeden

Нет, в консоли ничего нет. (С Помощью Инструментов Разработчика Chrome.) ... Это был хороший звонок. Я тестировал в FF, и в консоли нет ничего, кроме того, что я туда положил.

MadMyche

И есть ли возвращаемые данные?

Michael Breeden

Да. Я читаю значение в текстовом поле и отправляю его с помощью AJAX. Он работает в первый раз, затем текстовое поле становится "только для чтения" или "отключено", но я могу обновить другие элементы управления и повторно запустить процесс AJAX. Все данные считываются и отправляются правильно, включая данные в текстовом поле. Я просто не могу изменить эти данные.

Bryian Tan

Какую версию jQuery использует код? функция complete() может быть устаревшей . заменяет на всегда() на jQuery."Аякс" () | библиотека jQuery API документация[^]

Michael Breeden

Я использую jquery-1.8.2.min.js-но теперь, когда вы упомянули об этом, я попробую ... jquery-2.2.0.min.js ... Никакой Помощи, Шить... давайте посмотрим, что произойдет, если я по отдельности отключу и включу все элементы управления вместо этого.
(1)закомментируйте код:
$(документ).клавиша вниз(функция () { возвращение ложным; });
Это устраняет проблему, хотя и не объясняет ее...
Когда точки останова отключены, ответ почти мгновенный, поэтому я не уверен, что именно нужно попытаться отключить, чтобы это помогло. Это простая форма. Ааа. Кнопка может быть случайно нажата дважды (Есть ли у html-переключателя отскок, как у механического переключателя? :) ). Однако средство выбора даты не может быть использовано за то время, которое требуется для завершения ответа AJAX.

1 Ответов

Рейтинг:
12

Richard Deeming

Цитата:
закомментируйте код:
$(document).keydown(function () { return false; });

Это устраняет проблему, хотя и не объясняет ее...

Проблема в том, что вы не удаляете прослушиватель событий; вы просто добавляете другой прослушиватель событий.

Теперь у вас есть два слушателя для одного и того же события. Один возвращается false; другой возвращается true Нет никакой гарантии, в каком порядке эти слушатели будут выполняться, и нет никакого способа объединить возвращаемое значение от обоих слушателей.

Переместите слушателя в отдельную функцию. Тогда вы можете использовать то off метод[^] чтобы удалить слушателя.

Вы также можете переместить beforeSend код непосредственно перед началом работы ajax вызовите и используйте методы интерфейса promise для обратных вызовов.
var preventKeyboard = function() { return false; };

$(document).keydown(preventKeyboard); // disable keyboard input
$(".overlay").show(); // show loader
$('#loadingGIF').show();

$.ajax({
    type: "POST",
    url: "GC_UserErrors.aspx/receiveAJAXMessage",
    data: sMsg1,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
})
.done(OnSuccess)
.fail(OnFailure)
.always(function(){
    $(document).off("keydown", preventKeyboard); // enable keyboard
    $(".overlay").hide(); //hide loader
    $('#loadingGIF').hide();
    $('#idtxtLoggingDaysDisplayed').prop('disabled', false);
});


Michael Breeden

Потрясающий Ричард... Оглядываясь назад, я вижу очевидную, но простую ошибку. Большое вам спасибо!