我的目标是观察一个输入值,并在其值被程序更改时触发处理程序。我只需要适用于现代浏览器的解决方案。
我尝试了许多使用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建议的技巧是添加第二个输入以供用户交互。