我有一个input type="image"。这类似于Microsoft Excel中的单元格注释。如果有人在与此输入图像配对的文本框中输入数字,我将为输入图像设置一个事件处理程序。然后,当用户单击图像时,他们会看到一个小弹出窗口,向数据中添加一些注释。

我的问题是,当用户在文本框中输入0时,我需要禁用输入图像的事件处理程序。我试过以下方法,但都没用。

$('#myimage').click(function { return false; });

当前回答

这可以通过使用unbind函数来实现。

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

你可以在jquery中为同一个对象和事件添加多个事件处理程序。这意味着添加一个新的并不会取代旧的。

有几种策略可以更改事件处理程序,例如事件名称空间。在线文档中有几页是关于这个的。

看看这个问题(这就是我学习解绑定的方法)。答案中对这些策略有一些有用的描述。

如何阅读绑定悬停回调函数在jquery

其他回答

谢谢你提供的信息。非常有用,我用它来锁定页面交互,而在编辑模式下的另一个用户。我将它与ajaxComplete结合使用。不一定是相同的行为,但有些相似。

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

function executePageLock(){
    //do something
}

我必须使用道具和attr将事件设置为null。我不能只选一个。我也无法摆脱工作的束缚。我正在做TD元素。

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

我今天在工作中遇到了一个与此相关的有趣案例,其中有一个$(window)的滚动事件处理程序。

// TO ELIMINATE THE RE-SELECTION AND 
//   RE-CREATION OF THE SAME OBJECT REDUNDANTLY IN THE FOLLOWING SNIPPETS
let $window = $(window);

$window.on('scroll', function() { .... });

但是,要撤销那个事件处理程序,我们不能只使用

$window.off('scroll');

因为在这个非常常见的目标上可能有其他滚动事件处理程序,我对通过关闭所有滚动处理程序来冲洗其他功能(已知或未知)不感兴趣。

我的解决方案是首先将处理程序功能抽象为一个命名函数,并在事件侦听器设置中使用它。

function handleScrollingForXYZ() { ...... }

$window.on('scroll', handleScrollingForXYZ);

然后,有条件地,当我们需要撤销它时,我这样做:

$window.off('scroll', $window, handleScrollingForXYZ);

麻烦的部分是第二个参数,它冗余地选择原始选择器。但是,.off()的jquery文档只提供了一个方法签名来指定要删除的处理程序,这要求中间的参数为

当附加事件处理程序时,选择器应该匹配最初传递给.on()的选择器。

我没有冒险用null或''作为第二个参数来测试它,但也许多余的$窗口是不必要的。

如果事件以这种方式附加,目标将被解除附加:

$('#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.

});​

如果你通过html设置onclick,你需要removeAttr($(this).removeAttr('onclick'))

如果你通过jquery设置它(就像我上面例子中的第一次点击之后),那么你需要unbind($(this).unbind('click'))