私の目的は、入力値を監視し、その値がプログラムによって変更されたときにハンドラーをトリガーすることです。最新のブラウザでのみ必要です。
を使用して多くの組み合わせを試し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
value
これは私が期待しているように見えますが、既存の値プロパティをオーバーライドし、 (属性とプロパティ)の二重ステータスで遊んでいるので、ハックのように感じます。またchange
、変更されたプロパティが気に入らないと思われるイベントを中断します。
私の他の試み:
- setTimeout/setInterval ループですが、これもクリーンではありません
- さまざまな
watch
ポリフィルobserve
がありますが、入力値プロパティで壊れます
同じ結果を達成するための適切な方法は何でしょうか?
ライブデモ: http://jsfiddle.net/L7Emx/4/
[編集] 明確にするために: 私のコードは、他のアプリケーションが更新をプッシュできる入力要素を監視しています (たとえば、ajax 呼び出しの結果として、または他のフィールドの変更の結果として)。他のアプリケーションが更新をプッシュする方法を制御することはできません。私は単なるオブザーバーです。
[編集 2] 「最新のブラウザー」の意味を明確にするために、IE 11 および Chrome 30 で動作するソリューションに非常に満足しています。
[更新]受け入れられた回答に基づいてデモを更新: http://jsfiddle.net/L7Emx/10/
@mohit-jain が提案する秘訣は、ユーザー インタラクション用に 2 番目の入力を追加することです。