Функция AJAX вызывается первой еще до нажатия первой строки кнопки jQuery, почему?

Я работаю над приложением MVC, где мне нужно скрыть кнопку при нажатии кнопки и показать, когда запрос ajax завершен. Но кнопка скрывается после завершения всего запроса. Ниже то, что я пробовал.

<input type = "button" id = "btnCalculateAndSave" value = "Calculate & Save" style = "float: right" />

Ниже приведен щелчок jQuery, в котором также есть функция ajax, вызывающая одно и то же нажатие кнопки.

$("#btnCalculateAndSave").on("click", function (e) {
  $("#btnCalculateAndSave").hide();

  //Several lines for validation

  $.ajax({
    url: '@Url.Action("myControllerFunction", "myController")',
    type: "GET",
    async: false,
    cache: false,
    dataType: "JSON",
    data: { 
      "p1": v1, 
      "p2": v2
    },
    success: function(result) {
    }  
  }
}
});

Поскольку я должен предотвратить многократное нажатие кнопки. Таким образом, кнопка скрывается, но после того, как весь процесс ajax произошел, даже код скрытия кнопки находится в первой строке события клика jQuery.

Я не вижу никакого кода, который говорит, что кнопка снова видна. не будет ли success: function (result) { $("#btnCalculateAndSave").show()}

Carsten Løvbo Andersen 09.04.2019 09:39

добавить $("#btnCalculateAndSave").show(); внутри успеха

Vishwa 09.04.2019 09:39

Я написал шоу после всего процесса, но до того, как кнопка вызова ajax не скрывается.

Suraj Kumar 09.04.2019 09:40

Во-первых, откуда вы звоните show()? Во-вторых, удалите async: false, так как это очень плохая практика.

Rory McCrossan 09.04.2019 09:41

Да, забыл поставить $("#btnCalculateAndSave").show(). Думаю стоит поставить complete: function(result) {$("#btnCalculateAndSave").show()}. Это покажет кнопку после завершения вашего запроса ajax.

Apoorv 09.04.2019 09:42

Возможно, вам нужна стратегия обратного вызова, вызов ajax должен срабатывать только тогда, когда кнопка скрыта. Затем вы можете показать кнопку обратного вызова успешного вызова ajax.

Usman Afzal 09.04.2019 09:42

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

Suraj Kumar 09.04.2019 09:45

@SurajKumar Ну, ваш код наверняка спрятал бы это, $(this).hide(). Кстати, я предполагаю, что у вас есть только 1 элемент с этим идентификатором.

Carsten Løvbo Andersen 09.04.2019 09:47

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

Suraj Kumar 09.04.2019 09:49

@SurajKumar, почему бы тебе тогда просто не отключить кнопку?

Carsten Løvbo Andersen 09.04.2019 09:52

Это также не работает при запуске, так как мне нужна функциональность, например, подождите...

Suraj Kumar 09.04.2019 09:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
11
95
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы сначала прячете кнопку при нажатии на $("#btnCalculateAndSave").hide();, но нет инструкции по удалению кнопки после слов.

В соответствии с вашим вопросом вам нужно показать кнопку после завершения вызова ajax. Итак, что вы можете сделать, это поместить код для отображения кнопки в успехе ajax

$("#btnCalculateAndSave").on("click", function (e) {
   $("#btnCalculateAndSave").hide();
   .....
   //Several lines for validation
   .....
   $.ajax({
                    url: '@Url.Action("myControllerFunction", "myController")',
                    type: "GET",
                    async: false,
                    cache: false,
                    dataType: "JSON",
                    data: { "p1": v1, "p2": v2},
                    success: function (result) { 
//Add this line
$("#btnCalculateAndSave").show();  

                            }  
                        }
                    }
            });

Вы также можете передать функцию обратного вызова следующим образом: element.hide({done: some_function}); чтобы код выполнялся после того, как кнопка скрыта.

Usman Afzal 09.04.2019 09:46

Прошу вас посмотреть мои комментарии.

Suraj Kumar 09.04.2019 09:46

попробуйте, если вы можете скрыть его перед щелчком, или проверьте, не переопределяет ли какой-либо другой css display:none, установленный jquery hide(), или попробуйте $("#btnCalculateAndSave").css("display", "none !important" :);

Vishwa 09.04.2019 09:47

@UsmanAfzal В текущем примере из OP не было бы причин делать это.

Carsten Løvbo Andersen 09.04.2019 09:48

Как реализовать обратный вызов, как в вашем комментарии?

Suraj Kumar 09.04.2019 09:58

Надеюсь это поможет,

    var pr;
    $("#btnCalculateAndSave").on("click", function (e) {
              var btn = $(this)
              btn.hide()   

             if (pr)
                 pr.abort() //Prevent multiple time click

            //Several lines for validation
            pr =    $.ajax({
            url: '@Url.Action("myControllerFunction", "myController")',
            type: "GET",
            async: false,
            cache: false,
            dataType: "JSON",
            data: { 
              "p1": v1, 
              "p2": v2
            },
            success: function(result) {
                     btn.show()
            }  
          }
        }
    });

если скрытие не работает, используйте btn.css('cssText','display:none !important'), может быть проблема css, я думаю

Deepak A 09.04.2019 09:56

Вы можете использовать что-то вроде этого:

$("#btnCalculateAndSave").on("click", function (e) {
    $("#btnCalculateAndSave").hide(0, ajaxCall);
    //.....
    //Several lines for validation
    //.....

});

function ajaxCall() {

    $.ajax({
        url: '@Url.Action("myControllerFunction", "myController")',
        type: "GET",
        async: false,
        cache: false,
        dataType: "JSON",
        data: { "p1": v1, "p2": v2 },
        success: function (result) {
            //Add this line
            $("#btnCalculateAndSave").show();
        }
    });
}

Моя проблема в том, что кнопка скрывается после выполнения всех приведенных ниже кодов. Но ваш ответ: как показать кнопку после скрытия? Не мои требования.

Suraj Kumar 09.04.2019 10:00

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

Usman Afzal 31.01.2020 23:37
Ответ принят как подходящий

Пожалуйста, напишите основной код внутри функции скрытия.

$("#btnCalculateAndSave").hide(function(){ /* Main Code */ });

Ниже приведен ваш основной код.

 $("#btnCalculateAndSave").on("click", function (e) {
      $("#btnCalculateAndSave").hide(function(){

 $.ajax({
    url: '@Url.Action("myControllerFunction", "myController")',
    type: "GET",
    async: false,
    cache: false,
    dataType: "JSON",
    data: { 
      "p1": v1, 
      "p2": v2
    },
    success: function(result) {
    }  
  }
});

});

});

Другие вопросы по теме

Похожие вопросы

JS - Добавить ключ к соответствующему массиву, значения объекта
Метод фильтрации массива для сопоставления идентификаторов и проверки существования свойств
Как вставить данные в базу данных sqlite, используя общую функцию
Редактор форматированного текста отображается неправильно
Как отправлять и получать данные без перезагрузки страницы
Отключение позиции: исправлено при прокрутке, когда 250 пикселей от нижней части страницы
Для большего количества данных во временном ряду highchart вычисляет среднее значение
Как нарисовать строку из последовательных точек массива в openlayers
Перебирая массив строк, найдите две строки с наибольшим перекрытием и объедините их. ПОВТОРЯЙТЕ, пока не останется одна струна
Как отключить всплывающее окно «Перезагрузить сайт? Внесенные вами изменения могут быть не сохранены» для тестов селена (python) в chrome?