检测输入类型文本的程序更改

IT技术 javascript html
2021-03-10 05:57:04

有没有办法在脚本更改输入类型文本的值时获得通知。

我有

<input id='test' type='text' />

和一个脚本

document.getElementById('test').value = 'bbb'; 

我想收到有关文本更改的通知。

我知道我可以通过 keydown、keyup、onblur 等来通知我(如果我试图跟踪用户输入,这会起作用)但是如果更改是以编程方式完成的呢?

非常感谢

ps请不要JQuery,或者如果jquery可以,有人可以解释它是如何实现的。

2个回答

如果您使用的是现代浏览器,则可以尝试以下操作:

var input = document.getElementById('test');
input._value = input.value;
Object.defineProperty(input, "value", {
    get: function() {return this._value;},
    set: function(v) {
        // Do your stuff
        this._value = v;
    }
});

如果您实际上不希望有任何用户输入(即隐藏类型的输入字段),则此解决方案很好,因为它对DOM 基本功能具有极大的破坏性记住这一点。

@MaxArt 真的很聪明……但是有副作用吗?我有点担心重新定义“value”属性
2021-04-21 05:57:04
似乎当您重新定义value-attribute 时,输入字段不再“连接”到value-attribute。
2021-05-04 05:57:04
谢谢!它就像一个魅力。我仅使用它来确定哪个脚本更改了输入值。set: function(v) { console.log('input value changed to',v); console.trace(); this._value = v; }
2021-05-07 05:57:04
@ Zo72副作用这是主要的一个亚什德提到,再加上问题,如果用户键入一个新的value有没有办法,你可以检测一下他输入的,除非你要抓住每一个关键事件,并解释它。这已经是一团糟,但如果你添加剪切/复制/粘贴事件,它会变得很大。
2021-05-15 05:57:04
@MaxArt 我非常喜欢它。我只是希望有人已经这样做了,并且有一个 github 片段。这似乎是相当低级的东西。我会做并测试它,如果它有效,我会标记最佳答案
2021-05-17 05:57:04

我发现最简单的方法是手动触发事件:

document.getElementById('test').value = 'bbb';
var evt = new CustomEvent('change');
document.getElementById('test').dispatchEvent(evt);

change当以编程方式更改值时,仅侦听事件很容易出错。但由于您正在更改值,添加两行并使用CustomEvent触发更改事件

那么你将能够捕捉到这个change事件,无论是内联的:

<input id="test" onchange="console.log(this)">

或与听众:

document.getElementById('test').addEventListener('change',function(event) {
    console.log(event.target);
});

这样做的好处是,如果您有一个可由用户更改的输入,则可以捕获这两个事件(来自用户或脚本)

然而,这取决于您自己以编程方式更改输入值的事实。如果您使用的库(例如datepickr)会更改您的输入值,您可能必须输入代码并在正确的位置添加这两行。

现场演示:

// input node reference
const inputElem = document.querySelector('input')

// bind "change" event listener
inputElem.addEventListener('change', e => console.log(e.target.value))

// programatically change the input's value every 1 second
setInterval(() => { 
  // generate random value
  inputElem.value = Math.random() * 100 | 0; 
  
  // simulate the "change" event
  var evt = new CustomEvent('change')
  inputElem.dispatchEvent(evt)
}, 1000);
<input>

这是最好的答案!我已经找了几个月了!
2021-04-19 05:57:04
问题是当您想要检测代码中的值更改时,您不是 的作者,因此您不能在值更改时简单地触发假事件,而必须以某种方式检测它。(我有一个需要检测这样的东西的第 3 方插件)
2021-04-20 05:57:04
@akinuri 我相信你有点误会了。在输入普通文本输入的上下文中提到了用户:“ I know I could be notified by keydown,keyup, onblur etcetera (which works if I am trying to track user typing) but what about if the change is done programmatically ?”。这些事件是与文本输入交互时触发的正常事件。接受的答案也将其视为用户与正常输入的交互。接受的答案和我的答案都涵盖了最终用户的输入输入以及程序更改。
2021-04-23 05:57:04
我认为我们不同的地方在于,我认为程序性更改源自编写脚本的程序员,而您认为程序性更改源自访问网页的用户。
2021-05-07 05:57:04
这行不通,所以我错过了什么?如果用户打开控制台并执行$0.value = "asd"(参见$0),那么这change如何捕获请问,请用户触发更改事件吗?:)
2021-05-11 05:57:04