Подтвердить что ты не робот

JQuery - Как временно отключить прослушиватель событий onclick после того, как событие было запущено?

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

Пример:

После того, как пользователь нажимает на кнопку и запускает эту функцию ниже, я хочу отключить прослушиватель onclick, поэтому не запускаю ту же команду в мой просмотр django.

$(".btnRemove").click(function(){
   $(this).attr("src", "/url/to/ajax-loader.gif");
   $.ajax({
        type: "GET",
        url: "/url/to/django/view/to/remove/item/" + this.id,
        dataType: "json",
        success: function(returned_data){
            $.each(returned_data, function(i, item){
              // do stuff                       
     });
   }
});

Большое спасибо,

Альдо

4b9b3361

Ответ 1

Есть много способов сделать это. Например:

$(".btnRemove").click(function() {
    var $this = $(this);
    if ($this.data("executing")) return;
    $this
        .data("executing", true)
        .attr("src", "/url/to/ajax-loader.gif");
    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {
        // ... do your stuff ...
        $this.removeData("executing");
    });
});

или

$(".btnRemove").click(handler);

function handler() {
    var $this = $(this)
        .off("click", handler)
        .attr("src", "/url/to/ajax-loader.gif");
    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {
        // ... do your stuff ...
        $this.click(handler);
    });
}

Мы также можем использовать делегирование делегирования для более четкого кода и повышения производительности:

$(document).on("click", ".btnRemove:not(.unclickable)", function() {
    var $this = $(this)
        .addClass("unclickable")
        .attr("src", "/url/to/ajax-loader.gif");
    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {
        // ... do your stuff ...
        $this.removeClass("unclickable");
    });
});

Если нам не нужно повторно активировать обработчик после его выполнения, мы можем использовать метод .one(). Он связывает обработчики, которые должны выполняться только один раз. См. JQuery docs: http://api.jquery.com/one

Ответ 2

Как долго вы хотите отключить прослушиватель событий щелчка? Один из способов - отключить прослушиватель событий, используя jQuery unbind http://docs.jquery.com/Events/unbind.

Но лучше всего не отвязывать событие только для повторного его перебора. Вместо этого используйте boolean.

var active = true;
$(".btnRemove").click(function(){
   if(active){
       return;
   }
   active = false;
   $(this).attr("src", "/url/to/ajax-loader.gif");
   $.ajax({
        type: "GET",
        url: "/url/to/django/view/to/remove/item/" + this.id,
        dataType: "json",
        success: function(returned_data){
        active = true; // activate it again !
        $.each(returned_data, function(i, item){
              // do stuff                       
     });
   }
});

edit:, чтобы быть в безопасности, вы также должны заботиться о других процедурах завершения ajax (их всего три: success, error, complete см. docs), иначе active может оставаться ложным.

Ответ 3

почему бы не отключить кнопку? Любая конкретная причина, по которой вы хотите отключить этот список? BTB, из вашего кода, я вижу, что вы делаете ajax-вызов. Так вы специально хотите заблокировать пользователя, пока не вернется звонок? Если да, вы можете попробовать blockUI, плагин jQuery

Ответ 4

Я бы установил глобальную переменную, чтобы отслеживать запросы AJAX...

var myApp = {
  ajax: null
}

И тогда у вас есть немного волшебства, чтобы остановить одновременные запросы...

// Fired when an AJAX request begins
$.ajaxStart(function() { myApp.ajax = 1 });

// Fired when an AJAX request completes
$.ajaxComplete(function() { myApp.ajax = null });

// Fired before an AJAX request begins
$.ajaxSend(function(e, xhr, opt) {
  if(myApp.ajax != null) {
    alert("A request is currently processing. Please wait.");
    xhr.abort();
  }
});

При таком подходе вам не придется возвращаться через свой код и изменять каждый из ваших вызовов AJAX. (что-то я называю "добавлением" )

Ответ 5

Я бы использовал класс, например 'ajax-running'. Событие click будет выполняться только в том случае, если элемент с щелчком не имеет класса "ajax-running". Как только вы закончите сеанс ajax, вы можете удалить класс "ajax-running", чтобы его можно было снова щелкнуть.

$(".btnRemove").click(function(){
    var $button         = $(this);
    var is_ajaxRunning  = $button.hasClass('ajax-running');
    if( !is_ajaxRunning ){
        $.ajax({
            ...
            success: function(returned_data) {
                ...
                $button.removeClass('ajax-running');
            });
        };
    }   
});

Ответ 6

Я бы предложил отключить эту кнопку, а затем снова включить ее в ваших процедурах завершения Ajax (успех или неудача, помните). Если вы беспокоитесь о том, что браузер не соблюдает ваше отключение кнопки, вы можете вернуть это с помощью собственного флага на кнопке (например, установить атрибут с именем data-disabled, используя префикс data- в качестве хорошей практики и быть HTML5 совместимый). Но, несмотря на то, что на самом деле проблема с браузерами не отключена, я, вероятно, считаю это достаточно хорошим.

Ответ 7

Вы можете сделать действие в клике на основе логического значения. Когда он щелкнет, измените значение boolean и uset setTimeout(), чтобы изменить его обратно через несколько секунд. Это фактически ограничило бы пользователя нажатием кнопки только раз в несколько секунд.

var isEnabled = true;

$("a.clickMe").click(function(e){
  e.preventDefault();
  if (isEnabled == true) {
    isEnabled = false; // disable future clicks for now
    do_Something();
    setTimeout(function(){
      isEnabled = true;
    }, 3000); // restore functionality after 3 seconds
  }
});

Ответ 8

var ajaxAction = function() {
    var ele = $(this);
    ele.unbind("click", ajaxAction);
    ele.attr("src", "/url/to/ajax-loader.gif");
    $.ajax({
        type: "GET",
        url: "/url/to/django/view/to/remove/item/" + this.id,
        dataType: "json",
        success: function(returned_data) {
            $.each(returned_data, function(i, item) {
            });
        },
        complete: function() {
            ele.bind("click", ajaxAction);
        }
    });
}
$(".btnRemove").click(ajaxAction);

Ответ 9

Если вы отправляете сообщение через ajax, вы можете отключить кнопку при нажатии и включить ее после завершения процесса. Но если вы отправляете назад, вы не можете просто отключить кнопку. Отключение кнопки приводит к тому, что событие щелчка на стороне сервера не запускается. Поэтому просто спрячьте кнопку на клике и покажите дружеское сообщение. Сообщение как отключить кнопку asp.net при обратной передаче помогает.

Ответ 10

вы также можете просто скрыть кнопку (или содержащий div)

$(".btnRemove").click(function() {
   $(this).hide();
   // your code here...
})

и вы можете просто вызвать .show(), если вам нужно снова отобразить его.

Кроме того, в зависимости от вашего варианта использования вы должны вместо этого использовать накладку загрузки