当元素被启用/禁用时触发功能

时间:2015-04-14 15:22:10

标签: javascript jquery html twitter-bootstrap knockout.js

这似乎是一个相对简单的事情,但我找不到任何关于如何做的事情。我有一个模态,在等待异步数据时打开一个禁用的输入。我想知道什么时候输入启用,我可以集中输入。这就是我想要完成的。将其视为全局模态开放处理程序:

$('.modal').on('shown.bs.modal', function (event) {
    var textInput = $(event.target).find('input[type=text]:visible').first();
    if (textInput.is(':disabled'))
    {
        textInput.on('<<<<<enabled>>>>>', function(){
            textInput.off('<<<<<enabled>>>>>');
            textInput.focus();
        });
    }
    else
    {
        textInput.focus();
    }
});

输入启用/禁用时是否没有触发事件?

<input type="text" class="form-control txtUserSearch" data-bind="value: userFilter, event: { keyup: FilterUsers }, enable: AvailableUsers().length > 0">

如果在异步请求中返回了用户,则会启用。

3 个答案:

答案 0 :(得分:11)

不幸的是,没有onenabledondisabled听众这样的事情。输入字段只能在页面加载后由JavaScript启用/禁用(或者某些用户在他的开发人员工具&#39;检查器中弄乱了您的HTML)。出于这个原因,如果您想要检测这些更改,您必须使用MutationObserver ,并侦听所需元素的属性突变,以便在{{{{{ 1}}属性被添加到输入字段。

以下是我所谈论的一个例子:

&#13;
&#13;
disabled
&#13;
var btn = document.getElementById('toggle'),
    input = document.getElementById('inp');

// This is just to demonstrate the behavior of the MutationObserver
btn.addEventListener('click', function() {
    if (input.disabled) input.disabled = false;
    else input.disabled = true;
});
                     

var observer = new MutationObserver(function(mutations) {
    for (var i=0, mutation; mutation = mutations[i]; i++) {
        if (mutation.attributeName == 'disabled') {
            if (mutation.target.disabled) {
                // The element has been disabled, do something
                alert('You have disabled the input!');
            } else {
                // The element has been enabled, do something else
                alert('You have enabled the input!');
            }
        }
    };
});

// Observe attributes change
observer.observe(input, {attributes: true});
&#13;
&#13;
&#13;

其他信息

<p>Try clicking the button to disable/enable the input!</p> <input id="inp" type="text" placeholder="Write something..."> <button id="toggle">Toggle</button>对象是新推出的功能,某些浏览器的旧版本不支持此功能:您可以检查this page上任何浏览器的兼容性。

答案 1 :(得分:0)

我曾经有过一个项目,但我失去了这样做的动力。 我搜索了一种方法来做这种事情,我发现MutationObserver应该是一个很好的方法。

看看:MutationObserver

也许也有:Mutation Events

我希望我能正确理解你的问题。

答案 2 :(得分:0)

我知道这不是最好的方式,但是here I go

var timeToCheck = 1000, past = 0;

function wait_enable (element) {
    var timer = setInterval(function(){
        if(element.is(":enabled")){
            element.focus();
            clearInterval(timer);
        }
        /* //here you can set a limit
        past += timeToCheck;
        if (past > limit) {
            clearInterval(timer);
        }
        */
    }, timeToCheck);
}

var textInput = $("input");
wait_enable(textInput);

$("button").on("click", function(){
    textInput.prop("disabled", false);
});