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

发布于 2024-11-30 11:30:28 字数 428 浏览 0 评论 0原文

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

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

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

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

我想要一些可以在字段内容发生变化(无论是通过键盘还是通过鼠标)时起作用的东西......有什么想法吗?

I have an input element and I want to keep checking the length of the contents and whenever the length becomes equal to a particular size, I want to enable the submit button, but I am facing a problem with the onchange event of Javascript as the event fires only when the input element goes out of scope and not when the contents change.

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

----onchange does not fire on changing contents of name, but only fires when name goes out of focus.

Is there something I can do to make this event work on content change? or some other event I can use for this?
I found a workaround by using the onkeyup function, but that does not fire when we select some content from the auto completer of the browser.

I want something which can work when the content of the field change whether by keyboard or by mouse... any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

吃颗糖壮壮胆 2024-12-07 11:30:28
(function () {
    var oldVal;

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

这将捕获更改、击键、粘贴textInput输入(如果可用)。并且不要开超过必要的火。

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


参考文献:

< a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-type-textinput" rel="noreferrer">textInput — W3C DOM Level 3 事件类型。 http://www.w3.org/TR/DOM- 3 级事件/#events-textevents

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

inputHTML5 事件类型。

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

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

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

(function () {
    var oldVal;

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

This will catch change, keystrokes, paste, textInput, input (when available). And not fire more than necessary.

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


References:

textInput — a W3C DOM Level 3 event type. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

A user agent must dispatch this event when one or more characters have
been entered. These characters may originate from a variety of
sources, e.g., characters resulting from a key being pressed or
released on a keyboard device, from the processing of an input method
editor, or resulting from a voice command. Where a “paste” operation
generates a simple sequence of characters, i.e., a text passage
without any structure or style information, this event type should be
generated as well.

input — an HTML5 event type.

Fired at controls when the user changes the value

Firefox, Chrome, IE9 and other modern browsers support it.

This event occurs immediately after modification, unlike the onchange event, which occurs when the element loses focus.

情深缘浅 2024-12-07 11:30:28

我花了 30 分钟才找到它,但这是在 2019 年 6 月运行的。

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

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

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

It took me 30 minutes to find it, but this is working in June 2019.

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

and if you want to add an event listener programmatically in js

inputElement.addEventListener("input", event => {})
只是在用心讲痛 2024-12-07 11:30:28

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

As an extention to katspaugh's answer, here's a way to do it for multiple elements using a css class.

   $('.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());
        }
    });
晌融 2024-12-07 11:30:28

以 jQuery 方式进行操作:

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


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

Do it the jQuery way:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});
画离情绘悲伤 2024-12-07 11:30:28

您可以使用 onkeyup

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

You can use onkeyup

<input id="name" onkeyup="checkLength(this.value)" />
提笔书几行 2024-12-07 11:30:28

如果您想捕获所有可能性,则必须结合使用 onkeyuponclick(或 onmouseup)。

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

You would have to use a combination of onkeyup and onclick (or onmouseup) if you want to catch every possibility.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />
冷了相思 2024-12-07 11:30:28

这是我针对同一问题开发的另一个解决方案。不过,我使用了许多输入框,因此我将旧值保留为元素本身的用户定义属性:“数据值”。使用 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 方法。

Here is another solution I develop for the same problem. However I use many input boxes so I keep old value as an user-defined attribute of the elements itself: "data-value". Using jQuery it is so easy to manage.

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

here is, I used 5-6 input boxes have class 'filterBox',
I make filterBy method run only if data-value is different than its own value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文