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

IT技术 javascript jquery dom-events
2021-01-20 18:35:35

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

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

----onchange 不会在更改 name 的内容时触发,但仅在 name 失焦时触发。

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

我想要一些可以在字段内容通过键盘或鼠标更改时可以工作的东西......有什么想法吗?

6个回答
(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 Level 3 事件类型。http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

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

inputHTML5事件类型。

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

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

该事件在修改后立即发生,不像 onchange 事件发生在元素失去焦点时。

我检查textInput了 Chrome 15,它可以工作。input在 IE9 中检查了事件,它也有效。Firefox 应该支持DOMAttrModified,但我没有安装它。这两个事件是您所希望的最好的事件,因为它们会触发任何类型的文本输入。
2021-03-17 18:35:35
为了保持更新,目前这个解决方案在 FF22 中的单个输入更改上多次触发,您不需要使用按键或文本输入事件,输入和属性更改就足够了
2021-03-26 18:35:35
它不起作用......你最后检查你的代码了吗?它是否正在从自动完成程序中进行选择...?
2021-04-11 18:35:35
很棒的解决方案......输入对我来说就像一种祝福......除了需要输入之外没有别的东西,它本身就足够了。它适用于 ff4,但不适用于 3.x,我的桌面上有 3.6,它从未工作过......
2021-04-11 18:35:35
我发现change, keyup, 和input是涵盖 IE9 和 Firefox (36.0.4) 的最佳组合。keypress事件在 IE9 中似乎不起作用,因为它没有捕获诸如 Delete 和 Backspace 之类的内容,并且该input事件涵盖了使用键盘和上下文菜单进行粘贴。
2021-04-12 18:35:35

作为 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());
        }
    });

我花了 30 分钟才找到它,但这在 2019 年 6 月有效。

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

如果你想在 js 中以编程方式添加一个事件监听器

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

用 jQuery 的方式来做:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});
这也只会在领域失去焦点时触发。
2021-03-25 18:35:35
再次与 keyup 相同的问题......我已经使用过它并且我遇到了问题。阅读我的完整问题。
2021-04-05 18:35:35
@Felix Kling,真的,把它改成 keyup() ;)
2021-04-09 18:35:35

您可以使用 onkeyup

<input id="name" onkeyup="checkLength(this.value)" />
我使用过 onkeyup...但我的问题是当用户从浏览器的自动完成程序中进行选择时,则不会触发此事件...我已经在我使用的解决方法中的问题中写下了这个...
2021-03-17 18:35:35