Как отсоединить событие (функцию) jquery от элемента - PullRequest
3 голосов
/ 20 ноября 2011

Я хочу удалить это событие клика, если мой ajax-запрос был успешным:

  $('.el a').live('click', function(event){
    event.preventDefault();

    $.ajax({
      url: $(this).attr('href'),
      type: 'GET',      
      success: function(response){

         // how to detach this function here? (the live click event)
      }
    });
  });

Ответы [ 4 ]

6 голосов
/ 20 ноября 2011

Ваша проблема в том, что live не привязан к какому-либо конкретному набору элементов, он привязан к любому элементу, соответствующему определенному селектору, в момент события click. Это означает, что вы не можете использовать unbind или off, чтобы остановить клик от запуска обработчика.

Однако вы можете немного изменить селектор, чтобы исключить элементы с определенным классом, а затем добавить этот класс, чтобы сказать live игнорировать ваш элемент:

$('.el a:not(.been-clicked)').live('click', function(event){
  event.preventDefault();

  var $this = $(this);
  $.ajax({
    url: $this.attr('href'),
    type: 'GET',      
    success: function(response){
      $this.addClass('been-clicked');
    }
  });
});

Демонстрация техники: http://jsfiddle.net/ambiguous/Deh5j/


Грег Петтит прав в комментариях о том, что live больше не следует использовать, если вы используете jQuery 1.7 и несколько недовольны даже в 1.6. Обычно лучше использовать delegate до 1,7 и on, если вы используете 1,7:

$(document).on('click', '.el a:not(.been-clicked)', function() {
  //...
});

Вы все еще не можете использовать unbind или off, чтобы остановить эту версию on (за исключением очень узких обстоятельств, например, если у вас есть только один элемент, соответствующий .el a, и у вас есть только один обработчик щелчков прикреплен (или если вы используете именованную функцию)). Вам все еще нужно что-то вроде вышеупомянутого трюка «добавить класс как флаг», если вы используете привязку «живого» стиля, если вы привязываетесь к определенному набору элементов, которые существуют, когда вы привязываете свой обработчик кликов, тогда вы не должны Чтобы вообще не использовать live, вы должны использовать один из bind, click или on, чтобы привязать обработчик только к этим конкретным элементам; и затем вы можете использовать unbind или off для отсоединения обработчиков. Или, лучше, вы просто используете one и позволяете jQuery беспокоиться об отключении обработчика.

2 голосов
/ 20 ноября 2011

Я думаю, что вы хотите:

.unbind("click");

или в jQuery 1.7 +

.off("click");

Примечание: это удалит событие click из выбранного элемента;если вы хотите, чтобы у вновь созданных элементов не было события click (т.е. отключить метод live()), вместо этого вы захотите сделать:

$('.el a').die("click");
1 голос
/ 20 ноября 2011

Это можно сделать с помощью .unbind(), но вы не можете использовать this изнутри функции успеха класса ajax, так как она будет ссылаться на другой объект, полученный из обратного вызова функции затем элемент, по которому вы щелкнули, вместо этого создайте переменную, хранящую элемент, по которому щелкнули; В этом случае я использовал elem и использую его, чтобы отменить привязку события клика в случае успеха $(elem).unbind('click');

$('.el a').live('click', function(event){
    event.preventDefault();
    var elem = this;

    $.ajax({
        url: $(this).attr('href'),
        type: 'GET',      
        success: function(response){
            $(elem).unbind('click');
        }
    });
});

Редактировать : @mu слишком короткое, как указывалось в предыдущих версиях до 1.7, сложнее, чем следует убить событие, установленное с помощью .live () и его примера

0 голосов
/ 20 ноября 2011

используйте unbind http://api.jquery.com/unbind/

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