У меня input type = "image". Это действует как примечания к ячейкам в Microsoft Excel. Если кто-то вводит число в текстовое поле, с которым связан этот input-image, я устанавливаю обработчик событий для input-image. Затем, когда пользователь щелкает image, появляется небольшое всплывающее окно для добавления заметок к данным.
Моя проблема в том, что когда пользователь вводит ноль в текстовое поле, мне нужно отключить обработчик событий input-image. Я пробовал следующее, но безуспешно.
$('#myimage').click(function { return false; });

может быть, метод отмены привязки сработает для вас
$("#myimage").unbind("click");
Это можно сделать с помощью функции отмены привязки.
$('#myimage').unbind('click');
Вы можете добавить несколько обработчиков событий к одному и тому же объекту и событию в jquery. Это означает, что добавление нового не заменяет старые.
Существует несколько стратегий изменения обработчиков событий, например пространств имен событий. Об этом есть несколько страниц в онлайн-документации.
Взгляните на этот вопрос (вот как я узнал об отвязке). В ответах есть полезное описание этих стратегий.
Как читать связанные функции обратного вызова при наведении курсора в jquery
Начиная с 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');
В вашем примере кода вы просто добавляете еще одно событие щелчка к изображению, не отменяя предыдущее:
$('#myimage').click(function() { return false; }); // Adds another click event
После этого будут запущены оба события щелчка.
Как говорили люди, вы можете использовать unbind, чтобы удалить все события щелчка:
$('#myimage').unbind('click');
Если вы хотите добавить одно событие, а затем удалить его (не удаляя другие, которые могли быть добавлены), вы можете использовать пространство имен событий:
$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });
и удалить только свое мероприятие:
$('#myimage').unbind('click.mynamespace');
Что ж, если оба события все еще запускаются, очевидно, что это не работает. Вам нужно будет предоставить больше информации, чтобы получить правильный ответ. Попробуйте задать отдельный вопрос.
Старый ответ - также как и включенная информация о пространстве имен - но я забыл; возвращает ли включение / выключение объект jQ? Если да, то, возможно, более полным ответом будет гирляндное подключение: $('#myimage').off('click').on('click',function(){...}).
Да, они это делают, так что да, если вы хотите очистить все другие события щелчка, а затем добавить свое, вы можете выполнить приведенный выше цепной вызов.
Использование .unbind() помогло мне в ситуации, когда я переключал кучу флажков, но был уверен, что повторно добавлял обработчик .click(), что приводило к зависанию приложения.
@samjudson: не могли бы вы объяснить Почему, что мы хотели бы использовать off вместо отмены привязки? @ the0ther упоминает компилятор закрытия, но я не уверен, что это означает, и является ли это правильной / единственной причиной. Благодарность
Я считаю, что @theOther отдает предпочтение bind () над click (), а не bind () над (). on / off заменили bind / unbind в качестве предпочтительного метода в jQuery с версии 1.7, как указано выше. Я не знаю, что такое компилятор закрытия, поэтому не могу это комментировать.
просто вычеркнул мой комментарий из записи, ему было три года назад. вкл / выкл - это то, что нужно.
это хак ::: очистка всех событий от элемента независимо от того, были ли они установлены с использованием .on(..) или даже собственного .onclick = --- клонировать элемент с помощью .cloneNode(true), скрыть исходный элемент, вставить скопированный перед ним, при желании удалить оригинальный элемент впоследствии.
@samjudson, если кнопка имеет атрибут onclick = "return false;", ее слушатель jQuery click все еще запускается .. это правильно?
См. Комментарий Jwhittenburg ниже относительно объекта DOM, имеющего встроенный onclick = "doFoo" - используйте .prop("onclick", null).attr("onclick", null)
Ранее не знал о пространстве имен событий jQuery: api.jquery.com/event.namespace (довольно тонкая документация, tbh). Но именно то, что мне нужно, позволяет связывать / освобождать наборы событий как группу.
Это было недоступно, когда был дан ответ на этот вопрос, но вы также можете использовать метод прямой эфир() для включения / отключения событий.
$('#myimage:not(.disabled)').live('click', myclickevent);
$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });
Что произойдет с этим кодом, так это то, что когда вы нажмете кнопку #mydisablebutton, он добавит класс disabled в элемент #myimage. Это приведет к тому, что селектор больше не будет соответствовать элементу, и событие не будет запущено до тех пор, пока класс «disabled» не будет удален, что сделает селектор .live () снова действительным.
У этого есть и другие преимущества, так как добавляются стили, основанные на этом классе.
Хороший способ использовать live(), никогда раньше не думал о том, чтобы использовать его таким образом ... Помимо удобства кодирования, он быстрее или предлагает какие-либо другие преимущества при использовании привязки / отмены привязки?
Если вы добавляете / удаляете элементы, то есть определенные преимущества в производительности по сравнению с привязкой, поскольку привязка с live выполняется только один раз. Кажется, что jQuery переходит к более живым и делегированным событиям, а не привязке к конкретным элементам.
Чтобы отключить live, вы можете использовать die ()
«Начиная с jQuery 1.7, метод .live () устарел. Используйте .on () для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate () вместо .live ()». api.jquery.com/live
Ах, непостоянный jQuery, однажды ты принесешь парню 300 репутации, а на следующий день он устареет.
Спасибо за информацию. очень полезно, я использовал его для блокировки взаимодействия со страницей в режиме редактирования другим пользователем. Я использовал его вместе с 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, мы можем гарантировать, что один конкретный обработчик анонимной функции будет удален, и, таким образом, иметь единственный обработчик времени для данного события. Надеюсь, это поможет другим.
Безусловно, хотя иногда вам может потребоваться определенная логика относительно того, когда обработчик должен быть освобожден (например, не отключайте привязку, если сначала они не заполнили текстовое поле).
arguments.callee обрабатывается в строгом режиме!
Мне пришлось установить для события значение null, используя свойство и атрибут. Я не мог этого сделать ни с одним, ни с другим. Я тоже не мог заставить работать .unbind. Я работаю над элементом TD.
.prop("onclick", null).attr("onclick", null)
Я проголосовал за это, потому что я пытался отвязать onblur около 30 минут. '.unbind' не работал, '.prop' не работал, '.attr' не работал, но этот трюк с .prop и .attr вместе сработал. странный. Я использую Chrome с jquery 1.7.2
То же самое! Я попытался удалить событие клика из простого тега <a>! Спасибо за это. В моем случае .prop ("onclick", null) было достаточно.
то же самое. unbind и off не работали для меня на FF с jq 1.7.2 и .prop ("onclick", null) также было достаточно в моем случае
Я думаю, что причина, по которой описанные выше методы не сработали для вас, ребята, заключается в том, как вы их настроили. Если вы написали обработчик событий в DOM, тогда да, очистка этого атрибута необходима для очистки обработчика событий, однако я думаю, что большинство людей (включая меня) хотят, чтобы такие вещи (javascrip, обработчики событий и т. DOM, поэтому, когда мы хотим настроить обработчик событий, мы используем что-то вроде $("#elementId").click(function(){//Event execution code goes here});, чтобы его вообще не было на html-странице. Чтобы понять, что нам действительно нужно использовать .unbind() или предпочтительный .off()
Вот пример того, кто только что потратил час, чтобы обнаружить, что свойства, добавленные через jQuery, не отображаются на панели элементов Chrome. Пробовал unbind и off, и это не решало проблему. Большое спасибо вам!
Я с толпой «unbind () не сработал для меня», но это сработало, и я использую последнюю версию jquery. Иди фигура
Если событие прикреплено Сюда, а цель должна быть отключена:
$('#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, когда он уже доступен глобально?
Хороший вопрос, Брайан. Этот метод вошел в мой ген благодаря практике. - Может быть некоторая возможность для плагина, отличного от jquery, иметь переменную $, поэтому я не могу использовать $ напрямую. - Частое использование слова «jQuery» в файле сценария js может увеличить размер файла в байтах, где jQuery - это 6-байтовая строка. Поэтому я предпочитаю использовать «$» или любую однобайтовую переменную.
В случае, если метод .on() ранее использовался с определенным селектором, как в следующем примере:
$('body').on('click', '.dynamicTarget', function () {
// Code goes here
});
Оба метода unbind() и .off()не будут работать.
Однако метод .undelegate () можно использовать для полного удаления обработчика из события для всех элементов, которые соответствуют текущему селектору:
$("body").undelegate(".dynamicTarget", "click")
Я пролистал всю страницу, пока искал это решение, работало как шарм.
Я знаю, что это происходит поздно, но почему бы не использовать простой 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, если он доступен
Для 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();
});
Есть ли способ проверить, работает ли
unbind()? Я добавил его, и оба события все еще продолжаются.