Моя цель — наблюдать за входным значением и запускать обработчик, когда его значение изменяется программно. Мне это нужно только для современных браузеров.
Я пробовал много комбинаций, используя 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, состоит в том, чтобы добавить второй вход для взаимодействия с пользователем.
valueэквивалентен свойству.defaultValue. Вместо[sg]etAttributeвы должны использовать переменную закрытия - person Bergi   schedule 14.10.2013