javascript - 您如何侦听/检测输入值的更改 - 当输入值通过 javascript 更改时?
问题描述
我有一个input
与google autoComplete
连接。
当用户上下移动时,seachResults
输入的值通过 JavaScript 动态更改。
我想在任何给定时间捕获输入中的值。
我已经尝试过了onChange
,但是由于onInput
没有事件被触发,并且没有设置 - 没有更新。value
DOM Node
您如何检测input
通过 动态更新JavaScript
的更改?
解决方案
仅当脚本编写者调用设置新值时,该.value
属性才会更改setAttribute('value'
,这是一件很奇怪的事情。在几乎所有情况下,我都希望通过直接分配给value
属性来设置值,例如:
input.value = 'foo';
调用setAttribute
确实会显示检查的 DOM属性的变化,例如:
<input value="somevalue">
const input = document.querySelector('input');
input.setAttribute('value', 'foo');
console.log(input.outerHTML);
<input>
但是仅仅分配给元素的.value
属性不会导致这样的变化:
const input = document.querySelector('input');
input.value = 'foo';
console.log(input.outerHTML);
<input>
分配给.value
实际调用setterHTMLInputElement.prototype
函数:
console.log(HTMLInputElement.prototype.hasOwnProperty('value'));
您可以通过直接在元素本身上放置一个 getter/setter 来隐藏这一点,settervalue
调用您自己的函数,允许您监听更改:
const { get, set } = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
const input = document.querySelector('input');
Object.defineProperty(input, 'value', {
get() {
return get.call(this);
},
set(newVal) {
console.log('New value assigned to input: ' + newVal);
return set.call(this, newVal);
}
});
// example of autocomplete trying to change the input value:
input.value = 'foo';
<input>
推荐阅读
- c# - C# 简单控制台应用程序显示/逻辑问题
- python - 如何通过重新启动应用程序克服 ModbusTcpServer 中的“地址已在使用中”?
- javascript - 我如何获得其他应用程序的通知计数?
- javascript - Angular ui-router:隐藏参数和浏览器导航
- docusignapi - 有时收不到来自docusign的邮件
- java - 带有样式崩溃 java.lang.Exception 的 Android 启动画面:drawable 中的递归引用
- c++ - C++ 递增/递减运算符在单个输出语句中使用时表现不同
- excel - 比较声明为字符串的两个数字
- azure - 重新生成 Azure Application Insights 检测密钥
- url - 在 url 参数中的键内传递键