2016-09-25 66 views
0

我在我的一个元素上使用了keydown,但是如果它不适合我的情况,我想解除它。但我用off()unbind它似乎没有工作。仍然被触发的警报,我想知道为什么。从选择器中删除keydown事件不起作用?

if (imgDOM.naturalWidth > imgDOM.naturalHeight) { 

    $('#caption').attr('maxlength', 220); 

    $("#caption").keydown(function(e) { 
    if ((e.keyCode == 10 || e.keyCode == 13)) { 
     e.preventDefault(); 
     alert('Landscape photo is allowed to have only single line of message.'); 
     return false; 
    } 
    }); 

} else { 
    $('#caption').off('keydown', function() { //this won't work 
    limit_lines_for_potrait(); 
    }) 
} 
+0

也许这种情况'if(imgDOM.naturalWidth> imgDOM.naturalHeight){'永远是真的。 – vher2

+0

@ vher2不,当然。 –

回答

0

您使用.off(),如果它在听一个新的事件,在这种情况下,函数处理程序是refernce的功能取消绑定,而不是在那个时候解除绑定后运行的功能。 limit_lines_for_potrait()应该是你想要删除的函数,但是你的原始绑定使用了一个你不能引用的匿名函数。

假设您对同一元素和事件没有其他绑定,可以将其简化为:$('#caption').off('keydown');这将解除绑定该元素和事件类型的所有侦听器。

后运行该功能,只需调用该函数:

} else { 
    $('#caption').off('keydown'); 
    limit_lines_for_potrait(); 
} 

由于解除绑定不是一个倾听者,你不需要等待回调,它总是先下一执行线路运行。

+0

我想删除keydown绑定,并运行limit_lines_for_potrait –

+0

@MariaJane我已经更新了答案,您可以简单地在解除绑定事件后手动运行该函数(如vher2所示)解除绑定不是一个监听器,你不需要等待回调,它会在下一行运行 – DBS

+0

之前被执行,但是为什么回调没有按照它的方式工作? –

1

如果您删除off中的匿名函数,它将解决您的问题。

.... 

} else { 
    $('#caption').off('keydown'); 
    limit_lines_for_potrait(); 
} 
+0

关闭没有回拨? –

+0

这不是一个回调,解释@DBS – vher2