我的目标是观察输入值并在其值以编程方式更改时触发处理程序。我只需要现代浏览器。
我已经尝试了很多组合defineProperty
,这是我最新的迭代:
var myInput=document.getElementById("myInput");
Object.defineProperty(myInput,"value",{
get:function(){
return this.getAttribute("value");
},
set:function(val){
console.log("set");
// handle value change here
this.setAttribute("value",val);
}
});
myInput.value="new value"; // should trigger console.log and handler
这似乎符合我的预期,但感觉就像是一种 hack,因为我正在覆盖现有的 value 属性并使用value
(属性和属性)的双重状态。它还破坏了change
似乎不喜欢修改后的属性的事件。
我的其他尝试:
- 一个 setTimeout/setInterval 循环,但这也不干净
- 各种
watch
和observe
polyfill,但它们因输入值属性而中断
什么是达到相同结果的正确方法?
现场演示:http: //jsfiddle.net/L7Emx/4/
[编辑]澄清一下:我的代码正在监视其他应用程序可以推送更新的输入元素(例如,由于 ajax 调用,或由于其他字段的更改)。我无法控制其他应用程序如何推送更新,我只是一个观察者。
[编辑 2] 为了澄清我所说的“现代浏览器”的含义,我对适用于 IE 11 和 Chrome 30 的解决方案非常满意。
[更新]根据接受的答案更新了演示:http: //jsfiddle.net/L7Emx/10/
@mohit-jain 建议的技巧是为用户交互添加第二个输入。