【问题标题】:How do I programmatically trigger an “input” event without jQuery?如何在没有 jQuery 的情况下以编程方式触发“输入”事件?
【发布时间】:2016-06-10 02:58:21
【问题描述】:

我在 input 上安装了一个事件处理程序,使用

var element = document.getElementById('some-input');
element.addEventListener('input', function() {
    console.log('The value is now ' + element.value);
});

正如预期的那样,当我在文本字段中键入内容时会触发处理程序,但我还需要从我的代码中调用此处理程序。如何模拟input 事件以便调用我的事件监听器?

【问题讨论】:

标签: javascript


【解决方案1】:

使用纯 JavaScript 触发事件的正确方法是创建一个 Event 对象并调度它

var event = new Event('input', {
    bubbles: true,
    cancelable: true,
});

element.dispatchEvent(event);

FIDDLE

IE不支持这种方式,还是得用老办法

var event = document.createEvent('Event');
event.initEvent('input', true, true);

elem.dispatchEvent(event);

【讨论】:

  • @jeff-h 来自 MDN:旧版本的 IE 支持等效的专有 EventTarget.fireEvent() 方法。 developer.mozilla.org/en-US/docs/Web/API/EventTarget/…
  • 注意:默认输入事件是不可取消的
  • 现代复制粘贴:element.dispatchEvent(new Event('input', { bubbles: true }))
  • 这与new InputEvent() 有何不同,何时应该使用 InputEvent?
【解决方案2】:
element.dispatchEvent(new Event('input'));

【讨论】:

    【解决方案3】:

    如果您使用的是 react,以下将起作用:

    const valueSetter = Object.getOwnPropertyDescriptor(this.textInputRef, 'value').set;
    const prototype = Object.getPrototypeOf(this.textInputRef);
    const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
    if (valueSetter && valueSetter !== prototypeValueSetter) {
        prototypeValueSetter.call(this.textInputRef, 'new value');
    } else {
        valueSetter.call(this.textInputRef, 'new value');
    }
    this.textInputRef.dispatchEvent(new Event('input', { bubbles: true }));
    

    【讨论】:

    • Object.getOwnPropertyDescriptor(this.textInputRef, 'value') -> 有时返回未定义。
    【解决方案4】:

    试试这个代码

    var event = document.createEvent('Event');
    event.initEvent('input', true, true);
    
    elem.dispatchEvent(event);
    

    【讨论】:

    • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用,特别是对于已经有一个已接受答案的问题。请参阅:How do I write a good answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多