Лучший способ удалить обработчик событий в jQuery?

У меня input type = "image". Это действует как примечания к ячейкам в Microsoft Excel. Если кто-то вводит число в текстовое поле, с которым связан этот input-image, я устанавливаю обработчик событий для input-image. Затем, когда пользователь щелкает image, появляется небольшое всплывающее окно для добавления заметок к данным.

Моя проблема в том, что когда пользователь вводит ноль в текстовое поле, мне нужно отключить обработчик событий input-image. Я пробовал следующее, но безуспешно.

$('#myimage').click(function { return false; });
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1 090
0
744 370
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

может быть, метод отмены привязки сработает для вас

$("#myimage").unbind("click");

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

$('#myimage').unbind('click');

Вы можете добавить несколько обработчиков событий к одному и тому же объекту и событию в jquery. Это означает, что добавление нового не заменяет старые.

Существует несколько стратегий изменения обработчиков событий, например пространств имен событий. Об этом есть несколько страниц в онлайн-документации.

Взгляните на этот вопрос (вот как я узнал об отвязке). В ответах есть полезное описание этих стратегий.

Как читать связанные функции обратного вызова при наведении курсора в jquery

Ответ принят как подходящий

jQuery ≥ 1,7

Начиная с jQuery 1.7 был обновлен API событий, .bind() / .unbind() по-прежнему доступны для обратной совместимости, но предпочтительным методом является использование функций на() / выключенный(). Ниже будет теперь,

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery <1,7

В вашем примере кода вы просто добавляете еще одно событие щелчка к изображению, не отменяя предыдущее:

$('#myimage').click(function() { return false; }); // Adds another click event

После этого будут запущены оба события щелчка.

Как говорили люди, вы можете использовать unbind, чтобы удалить все события щелчка:

$('#myimage').unbind('click');

Если вы хотите добавить одно событие, а затем удалить его (не удаляя другие, которые могли быть добавлены), вы можете использовать пространство имен событий:

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

и удалить только свое мероприятие:

$('#myimage').unbind('click.mynamespace');

Есть ли способ проверить, работает ли unbind()? Я добавил его, и оба события все еще продолжаются.

David Yell 23.09.2010 14:41

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

samjudson 07.10.2010 18:02

Старый ответ - также как и включенная информация о пространстве имен - но я забыл; возвращает ли включение / выключение объект jQ? Если да, то, возможно, более полным ответом будет гирляндное подключение: $('#myimage').off('click').on('click',function(){...}).

vol7ron 10.01.2013 23:25

Да, они это делают, так что да, если вы хотите очистить все другие события щелчка, а затем добавить свое, вы можете выполнить приведенный выше цепной вызов.

samjudson 11.01.2013 14:47

Использование .unbind() помогло мне в ситуации, когда я переключал кучу флажков, но был уверен, что повторно добавлял обработчик .click(), что приводило к зависанию приложения.

TecBrat 18.03.2014 18:35

@samjudson: не могли бы вы объяснить Почему, что мы хотели бы использовать off вместо отмены привязки? @ the0ther упоминает компилятор закрытия, но я не уверен, что это означает, и является ли это правильной / единственной причиной. Благодарность

Adrien Be 16.04.2014 15:07

Я считаю, что @theOther отдает предпочтение bind () над click (), а не bind () над (). on / off заменили bind / unbind в качестве предпочтительного метода в jQuery с версии 1.7, как указано выше. Я не знаю, что такое компилятор закрытия, поэтому не могу это комментировать.

samjudson 16.04.2014 18:09

просто вычеркнул мой комментарий из записи, ему было три года назад. вкл / выкл - это то, что нужно.

Randy L 16.04.2014 18:16

это хак ::: очистка всех событий от элемента независимо от того, были ли они установлены с использованием .on(..) или даже собственного .onclick = --- клонировать элемент с помощью .cloneNode(true), скрыть исходный элемент, вставить скопированный перед ним, при желании удалить оригинальный элемент впоследствии.

user257319 04.03.2015 17:17

@samjudson, если кнопка имеет атрибут onclick = "return false;", ее слушатель jQuery click все еще запускается .. это правильно?

techie_28 23.05.2016 12:39

См. Комментарий Jwhittenburg ниже относительно объекта DOM, имеющего встроенный onclick = "doFoo" - используйте .prop("onclick", null).attr("onclick", null)

gordon 03.08.2017 21:02

Ранее не знал о пространстве имен событий jQuery: api.jquery.com/event.namespace (довольно тонкая документация, tbh). Но именно то, что мне нужно, позволяет связывать / освобождать наборы событий как группу.

Morvael 08.04.2019 13:58

Это было недоступно, когда был дан ответ на этот вопрос, но вы также можете использовать метод прямой эфир() для включения / отключения событий.

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

Что произойдет с этим кодом, так это то, что когда вы нажмете кнопку #mydisablebutton, он добавит класс disabled в элемент #myimage. Это приведет к тому, что селектор больше не будет соответствовать элементу, и событие не будет запущено до тех пор, пока класс «disabled» не будет удален, что сделает селектор .live () снова действительным.

У этого есть и другие преимущества, так как добавляются стили, основанные на этом классе.

Хороший способ использовать live(), никогда раньше не думал о том, чтобы использовать его таким образом ... Помимо удобства кодирования, он быстрее или предлагает какие-либо другие преимущества при использовании привязки / отмены привязки?

chakrit 11.03.2010 19:53

Если вы добавляете / удаляете элементы, то есть определенные преимущества в производительности по сравнению с привязкой, поскольку привязка с live выполняется только один раз. Кажется, что jQuery переходит к более живым и делегированным событиям, а не привязке к конкретным элементам.

MacAnthony 26.03.2010 19:23

Чтобы отключить live, вы можете использовать die ()

Moons 07.12.2011 14:37

«Начиная с jQuery 1.7, метод .live () устарел. Используйте .on () для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate () вместо .live ()». api.jquery.com/live

Lucas Pottersky 29.12.2011 22:49

Ах, непостоянный jQuery, однажды ты принесешь парню 300 репутации, а на следующий день он устареет.

MrBoJangles 28.02.2013 03:14

Спасибо за информацию. очень полезно, я использовал его для блокировки взаимодействия со страницей в режиме редактирования другим пользователем. Я использовал его вместе с ajaxComplete. Не обязательно такое же поведение, но в чем-то похожее.

function userPageLock(){
    $("body").bind("ajaxComplete.lockpage", function(){
        $("body").unbind("ajaxComplete.lockpage");
        executePageLock();      
    });
};  

function executePageLock(){
    //do something
}

Если вы хотите ответить на событие только однажды, следующий синтаксис должен быть действительно полезным:

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

Используя arguments.callee, мы можем гарантировать, что один конкретный обработчик анонимной функции будет удален, и, таким образом, иметь единственный обработчик времени для данного события. Надеюсь, это поможет другим.

Безусловно, хотя иногда вам может потребоваться определенная логика относительно того, когда обработчик должен быть освобожден (например, не отключайте привязку, если сначала они не заполнили текстовое поле).

ghayes 25.03.2013 02:47

arguments.callee обрабатывается в строгом режиме!

zloctb 26.11.2013 11:38

Мне пришлось установить для события значение null, используя свойство и атрибут. Я не мог этого сделать ни с одним, ни с другим. Я тоже не мог заставить работать .unbind. Я работаю над элементом TD.

.prop("onclick", null).attr("onclick", null)

Я проголосовал за это, потому что я пытался отвязать onblur около 30 минут. '.unbind' не работал, '.prop' не работал, '.attr' не работал, но этот трюк с .prop и .attr вместе сработал. странный. Я использую Chrome с jquery 1.7.2

Jeremy 31.05.2012 10:31

То же самое! Я попытался удалить событие клика из простого тега <a>! Спасибо за это. В моем случае .prop ("onclick", null) было достаточно.

Jan Lobau 17.10.2012 17:20

то же самое. unbind и off не работали для меня на FF с jq 1.7.2 и .prop ("onclick", null) также было достаточно в моем случае

bryanallott 27.03.2013 12:58

Я думаю, что причина, по которой описанные выше методы не сработали для вас, ребята, заключается в том, как вы их настроили. Если вы написали обработчик событий в DOM, тогда да, очистка этого атрибута необходима для очистки обработчика событий, однако я думаю, что большинство людей (включая меня) хотят, чтобы такие вещи (javascrip, обработчики событий и т. DOM, поэтому, когда мы хотим настроить обработчик событий, мы используем что-то вроде $("#elementId").click(function(){//Event execution code goes here});, чтобы его вообще не было на html-странице. Чтобы понять, что нам действительно нужно использовать .unbind() или предпочтительный .off()

VoidKing 18.05.2013 00:32

Вот пример того, кто только что потратил час, чтобы обнаружить, что свойства, добавленные через jQuery, не отображаются на панели элементов Chrome. Пробовал unbind и off, и это не решало проблему. Большое спасибо вам!

Geeky Guy 13.10.2014 23:58

Я с толпой «unbind () не сработал для меня», но это сработало, и я использую последнюю версию jquery. Иди фигура

Darkloki 02.03.2015 23:48

Если событие прикреплено Сюда, а цель должна быть отключена:

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​

Это тоже отлично работает. Просто и легко. См. http://jsfiddle.net/uZc8w/570/

$('#myimage').removeAttr("click");

Вы можете добавить обработчик onclick как встроенную разметку:

<input id = "addreport" type = "button" value = "Add New Report" onclick = "openAdd()" />

Если это так, jquery .off() или .unbind() работать не будут. Вам также необходимо добавить исходный обработчик событий в jquery:

$("#addreport").on("click", "", function (e) {
   openAdd();
});

Тогда jquery имеет ссылку на обработчик события и может его удалить:

$("#addreport").off("click")

VoidKing упоминает об этом чуть более косвенно в комментарии выше.

Обновлено на 2014 год

Используя последнюю версию jQuery, вы теперь можете отвязать все события в пространстве имен, просто выполнив $( "#foo" ).off( ".myNamespace" );

Все описанные подходы у меня не работали, потому что я добавлял событие click с on() в документ, в котором элемент был создан во время выполнения:

$(document).on("click", ".button", function() {
    doSomething();
});


Мое обходное решение:

Поскольку я не мог отвязать класс «.button», я просто назначил другой класс кнопке с такими же стилями CSS. Поступая таким образом, обработчик события в реальном времени или по событию наконец проигнорировал щелчок:

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");

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

если вы устанавливаете onclick через html, вам нужно removeAttr ($(this).removeAttr('onclick'))

если вы установите его через jquery (как после первого щелчка в моих примерах выше), вам понадобится unbind($(this).unbind('click'))

Лучший способ удалить встроенное событие onclick - $(element).prop('onclick', null);

Надеюсь, мой приведенный ниже код все объяснит. HTML:

(function($){

     $("#btn_add").on("click",function(){
       $("#btn_click").on("click",added_handler);
       alert("Added new handler to button 1");
     });

  
 
     $("#btn_remove").on("click",function(){
       $("#btn_click").off("click",added_handler);
       alert("Removed new handler to button 1");
     });

  
   function fixed_handler(){
    alert("Fixed handler");
  }
  
   function added_handler(){
    alert("new handler");
  }
  
  $("#btn_click").on("click",fixed_handler);
  $("#btn_fixed").on("click",fixed_handler);
  
  
})(jQuery);
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id = "btn_click">Button 1</button>
  <button id = "btn_add">Add Handler</button>
  <button id = "btn_remove">Remove Handler</button>
  <button id = "btn_fixed">Fixed Handler</button>

почему вы передаете })(jQuery); в IIFE, когда он уже доступен глобально?

Bryan P 19.01.2016 10:01

Хороший вопрос, Брайан. Этот метод вошел в мой ген благодаря практике. - Может быть некоторая возможность для плагина, отличного от jquery, иметь переменную $, поэтому я не могу использовать $ напрямую. - Частое использование слова «jQuery» в файле сценария js может увеличить размер файла в байтах, где jQuery - это 6-байтовая строка. Поэтому я предпочитаю использовать «$» или любую однобайтовую переменную.

mysticmo 19.01.2016 12:44

В случае, если метод .on() ранее использовался с определенным селектором, как в следующем примере:

$('body').on('click', '.dynamicTarget', function () {
    // Code goes here
});

Оба метода unbind() и .off()не будут работать.

Однако метод .undelegate () можно использовать для полного удаления обработчика из события для всех элементов, которые соответствуют текущему селектору:

$("body").undelegate(".dynamicTarget", "click")

Я пролистал всю страницу, пока искал это решение, работало как шарм.

Abhishek Pandey 18.02.2019 14:05

Я знаю, что это происходит поздно, но почему бы не использовать простой JS для удаления события?

var myElement = document.getElementById("your_ID");
myElement.onclick = null;

или, если вы используете именованную функцию в качестве обработчика событий:

function eh(event){...}
var myElement = document.getElementById("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it

Хорошее предложение, я предпочитаю использовать собственный javascript, если он доступен

Michiel 09.09.2019 18:05

Для removeВСЕevent-handlers у меня сработало следующее:

Удаление всех обработчиков событий означает наличие простого HTML structure без всех event handlers, подключенных к element и его child nodes. В этом помог jQuery's clone().

var original, clone;
// element with id my-div and its child nodes have some event-handlers
original = $('#my-div');
clone = original.clone();
//
original.replaceWith(clone);

С этим у нас будет clone вместо original без event-handlers на нем.

Удачи...

Если вы используете $(document).on() для добавления слушателя к динамически создаваемому элементу, вам, возможно, придется использовать следующее, чтобы удалить его:

// add the listener
$(document).on('click','.element',function(){
    // stuff
});

// remove the listener
$(document).off("click", ".element");

Просто удалите это с кнопки:

$('.classname').click(function(){
$( ".classname" ).remove();
});

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