Лучший способ удалить обработчик событий в jQuery?
у меня есть input type="image". Это действует как примечания ячейки в Microsoft Excel. Если пользователь вводит число в текстовое поле, что это input-image в паре с, я устанавливаю обработчик событий для input-image. Затем, когда пользователь нажимает image, они получают небольшое всплывающее окно, чтобы добавить некоторые заметки к данным.
моя проблема заключается в том, что когда пользователь вводит ноль в текстовое поле, мне нужно запретить input-image'обработчик события. Я пробовал следующее, но безрезультатно.
$('#myimage').click(function { return false; });
18 ответов:
jQuery ≥ 1.7
С jQuery 1.7 и далее API событий был обновлен,
.bind()/.unbind()по-прежнему доступны для обратной совместимости, но предпочтительным методом является использование on ()/выкл() функции. Ниже теперь будет,$('#myimage').click(function() { return false; }); // Adds another click event $('#myimage').off('click'); $('#myimage').on('click.mynamespace', function() { /* Do stuff */ }); $('#myimage').off('click.mynamespace');
jQuery
в вашем примере кода, Вы просто добавляете еще одно событие click к изображению, не отменяя предыдущего:
$('#myimage').click(function() { return false; }); // Adds another click eventобе кнопку затем события будут уволены.
как люди сказали, Вы можете использовать unbind для удаления всех событий щелчка:
$('#myimage').unbind('click');если вы хотите добавить одно событие, а затем удалить его (не удаляя другие, которые могли быть добавлены), то вы можете использовать пространство имен событий:
$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });и удалить только ваше событие:
$('#myimage').unbind('click.mynamespace');
Это было недоступно, когда на этот вопрос был дан ответ, но вы также можете использовать live () метод включения / выключения событий.
$('#myimage:not(.disabled)').live('click', myclickevent); $('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });что произойдет с этим кодом, так это то, что при нажатии #mydisablebutton он добавит класс disabled в элемент #myimage. Это сделает так, что селектор больше не соответствует элементу, и событие не будет запущено, пока не будет удален класс "disabled".жить() селектор действует снова.
Это имеет и другие преимущества, добавляя стиль на основе этого класса, а также.
Это можно сделать с помощью функции unbind.
$('#myimage').unbind('click');вы можете добавить несколько обработчиков событий к одному объекту и событию в jquery. Это означает, что добавление нового не заменяет старые.
существует несколько стратегий для изменения обработчиков событий, таких как пространства имен событий. Есть несколько страниц об этом в онлайн-документации.
посмотрите на этот вопрос (вот как я узнал о unbind). Существует некоторое полезное описание этих стратегий в ответ.
Как читать связанные функции обратного вызова при наведении в jquery
Если вы хотите ответить на событие только один раз следующий синтаксис должен быть действительно полезным:
$('.myLink').bind('click', function() { //do some things $(this).unbind('click', arguments.callee); //unbind *just this handler* });С помощью аргументов.вызываемый, мы можем гарантировать, что один конкретный обработчик анонимной функции будет удален и, таким образом, будет иметь один обработчик времени для данного события. Надеюсь, это поможет другим.
Я должен был установить событие в null с помощью prop и attr. Я не мог сделать этого ни с тем, ни с другим. Я тоже не мог попасть .отвяжитесь от работы. Я работаю над элементом TD.
.prop("onclick", null).attr("onclick", null)
вы можете добавить
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 упоминает об этом немного более косвенно в комментарии выше.
Если событие прилагается таким образом, и цель должна быть не привязана:
$('#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. });
обновлено на 2014 год
используя последнюю версию jQuery, теперь вы можете отменить привязку всех событий в пространстве имен, просто сделав
$( "#foo" ).off( ".myNamespace" );
Спасибо за информацию. очень полезно я использовал его для блокировки взаимодействия страниц в режиме редактирования другим пользователем. Я использовал его в сочетании с ajaxComplete. Не обязательно то же самое поведение, но несколько похожее.
function userPageLock(){ $("body").bind("ajaxComplete.lockpage", function(){ $("body").unbind("ajaxComplete.lockpage"); executePageLock(); }); }; function executePageLock(){ //do something }
в случае
.on()метод ранее использовался с определенным селектором, как в следующем примере:$('body').on('click', '.dynamicTarget', function () { // Code goes here });и
unbind()и.off()методы не иду на работу.однако, .undelegate() метод может быть использован для полного удаления обработчика из события для всех элементов, которые соответствуют текущему селектору:
$("body").undelegate(".dynamicTarget", "click")
Это тоже отлично работает .Просто и легко.см.http://jsfiddle.net/uZc8w/570/
$('#myimage').removeAttr("click");
если вы выберите
onclickчерезhtmlвам нужноremoveAttr ($(this).removeAttr('onclick'))если вы установите его через jQuery (как после первого клика в моих примерах выше), то вам нужно
unbind($(this).unbind('click'))
до
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на нем.Удачи...
надеюсь, что мой ниже код объясняет все. 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>
Я знаю, что это приходит поздно, но почему бы не использовать простой 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
все описанные подходы не работали для меня, потому что я добавлял событие click с
on()к документу, в котором элемент был создан во время выполнения:$(document).on("click", ".button", function() { doSomething(); });
мое решение:как я не мог разомкнуть ".кнопка " класс я только что назначил другой класс для кнопки, которая имела те же стили CSS. При этом обработчик live/on-event-handler проигнорировал щелчок наконец:
// prevent another click on the button by assigning another class $(".button").attr("class","buttonOff");надеюсь, что это поможет.
Comments