输入元素上的JavaScript更改事件仅在失去焦点时触发


84

我有一个输入元素,我想继续检查内容的长度,每当长度等于特定大小时,我都希望启用提交按钮,但是我遇到了Java的onchange事件作为事件的问题仅在输入元素超出范围时触发,而在内容更改时不触发。

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange不会在更改名称内容时触发,而仅在名称失去焦点时才触发。

我可以做些什么来使此事件在内容更改上起作用吗?或其他可以用于此目的的事件?我通过使用onkeyup函数找到了一种解决方法,但是当我们从浏览器的自动完成器中选择某些内容时,这种方法不会触发。

我希望在通过键盘或鼠标更改字段内容时可以使用的东西……有什么想法吗?


您可以使用onkeyuponchange吗?
James Allardice 2011年

1
我唯一的问题是浏览器的自动完成程序选择不会导致任何这些事件发生。
2011年

这是什么样的输入字段?
powtac

哦...我忘了将它添加到示例代码中,它是一个文本字段。
2011年

1
我以为这将是一个非常普遍的问题,很多人会面对它,但是现在看来却
恰恰相反

Answers:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

这将捕获change,击键,pastetextInputinput(如果可用)。并没有超过必要的火力。

http://jsfiddle.net/katspaugh/xqeDj/


参考文献:

textInput— W3C DOM级别3事件类型。http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

输入一个或多个字符后,用户代理必须调度此事件。这些字符可以源自多种来源,例如,由在键盘设备上按下或释放的键,输入法编辑器的处理或语音命令导致的字符。如果“粘贴”操作生成简单的字符序列,即没有任何结构或样式信息的文本段落,则也应生成此事件类型。

inputHTML5事件类型。

用户更改值时在控件上触发

Firefox,Chrome,IE9和其他现代浏览器都支持它。

与onchange事件不同,此事件在修改后立即发生,而onchange事件在元素失去焦点时发生。


1
它没有用...您是否在结束时检查了代码?它是在自动完成程序中进行选择吗?
2011年

我检查textInput了Chrome 15,它可以正常工作。我input在IE9中检查了事件,它也起作用。Firefox应该支持DOMAttrModified,但是我没有安装它。这两个事件是您希望得到的最好的事件,因为它们会触发任何类型的文本输入。
katspaugh

1
很棒的解决方案...输入对我来说是一种祝福...除输入外无需其他,它本身就足够了。它可以在ff4上运行,但不能在3.x上运行,而且我的台式机上只有3.6,并且永远无法正常工作……
Sachin Midha 2011年

5
为了使事情保持更新,当前此解决方案在FF22中的单个输入更改上就触发了多次,因此您无需使用按键或文本输入事件,输入和属性更改就足够了
Cyber​​-guard

1
我发现changekeyupinput是涵盖IE9和Firefox(36.0.4)的最佳组合。该keypress事件在IE9中似乎不起作用,因为它没有捕获诸如Delete和Backspace之类的input事件,并且该事件涉及使用键盘和上下文菜单进行粘贴。
TLS

9

作为对Katspaugh答案的扩展,这是一种使用CSS类对多个元素执行此操作的方法。

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

我花了30分钟才能找到它,但这已经在2019年6月开始了。

<input type="text" id="myInput" oninput="myFunction()">

并且如果您想以编程方式在js中添加事件监听器

inputElement.addEventListener("input", event => {})

3

使用jQuery方式:

<input type="text" id="name" name="name"/>


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
只有在视野松散时,才会触发此操作。
Felix Kling

@Felix Kling,是的,将其更改为keyup();)
powtac 2011年

再次与键盘问题相同...我用过了&我有一个问题。阅读我完整的问题。
2011年

0

您可以使用onkeyup

<input id="name" onkeyup="checkLength(this.value)" />

我使用过onkeyup ...但是我的问题是,当用户从浏览器的自动完成器中选择时,则不会触发此事件...我已经在我使用的解决方法中将此问题写在了这个问题中……
Sachin Midha

0

如果要抓住一切可能,则必须使用onkeyuponclick(或onmouseup)的组合。

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

不错的尝试,但是这里的问题是我没有在输入元素上按下鼠标,而是在自动完成器上按下了鼠标,这不会触发此事件……
Sachin Midha 2011年

我能想到的唯一一件令人讨厌的事情是,setTimeout并定期检查该字段的值...您到底想做什么?
DaveRandom

太讨厌了...:D,它类似于密码强度指示器的功能,它会告诉您不断输入密码的强度。我只想在输入的字符串长度为10时启用按钮,否则请禁用它。我希望你明白了……
Sachin Midha 2011年

0

这是我针对相同问题开发的另一种解决方案。但是,我使用了许多输入框,因此我将旧值保留为元素本身的用户定义属性:“数据值”。使用jQuery非常容易管理。

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

在这里,我使用了5-6个输入框,它们的类为'filterBox',仅当data-value与其自身值不同时,我才使filterBy方法运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.