是否可以在启用或禁用元素时触发事件处理程序?

时间:2013-03-08 09:26:58

标签: javascript jquery html

我想在启用或禁用输入时执行方法。可以用jQuery做吗?

我想做类似的事情(non-working code below): -

$('input').on('enabled', function(e){
   alert( 'Just now someone enabled : ' + $(this).attr('id') );
   executeSomeHandlerForENABLED();
}).on('disabled', function(e){
   alert( 'Just now someone disabled : ' + $(this).attr('id') );
   executeSomeHandlerForDISABLED();
});

2 个答案:

答案 0 :(得分:2)

是的!对于现代浏览器,正确的方法是使用MutationObservers。不幸的是,即使IE10不支持MutationObservers,也不要介意IE8和9.为了支持IE 8-10,你需要在设置禁用时自己触发propertychange事件,为此你需要更改getter和要启用/禁用的元素上的setter。

以下是一些关于此技术的好文章:

不幸的是,您不能仅在setter中的已禁用事件上使用本机fireEvent,因为它遵循禁用状态。因此我们需要一个外部事件触发系统。幸运的是,jQuery的优秀人员已经做到了!

所以,凭借这些知识,我编写了一个fireOnDisable jQuery插件。要使用它,只需将其应用于选择器,例如:

$('#disabled_thing').fireOnDisable();

如果您使用的浏览器本身不支持propertychange事件,则此插件将不执行任何操作。它专门用于IE8-10。对于IE7或更低版​​本,你被搞砸了,因为它们没有公开setter / getter函数。

答案 1 :(得分:1)

是,,但您所尝试的并非易事。

你可以做的是,使用propertychange事件(顺便提一下IE上没有)来捕捉属性的变化。

我用谷歌搜索并发现了this解决方案。一个插件,用于观察属性的变化。对于IE来说,它回落到setTimeout(),这确实非常悲伤。

无论如何,使用该解决方案的解决方案将类似于:

$("input").watch('disabled', function() {
    console.log($(this).is(":disabled"));
});