JS事件:在文本input上挂钩值更改事件

我有一个文本input的内容是由脚本不是由用户更改。 所以我想在值发生变化时触发一个事件。 我无法find合适的事件。 我什至发现这在StackOverflow ,但它不是我正在寻找的解决scheme。

如何使这个工作与jQuery和文本input的价值是这样设置的:

myTextControl.value = someValue 

在这里,我想发起一个事件来看到新的价值。

我无法find合适的事件。

是的,没有一个。

有DOM突变事件 ,但是它们不被跨浏览器支持,并且不会为表单值触发,因为它们没有被反映在属性中(除了在IE中由于错误)。

仅在Mozilla中,可以在值属性上设置JavaScript 手表来捕捉脚本更改。 仅在IE中,可以将JScript onpropertychange处理程序设置为同时捕获脚本和用户驱动的更改。 在其他浏览器中,您将不得不使用自己的间隔轮询器来查找更改。

 function watchProperty(obj, name, handler) { if ('watch' in obj) { obj.watch(name, handler); } else if ('onpropertychange' in obj) { name= name.toLowerCase(); obj.onpropertychange= function() { if (window.event.propertyName.toLowerCase()===name) handler.call(obj); }; } else { var o= obj[name]; setInterval(function() { var n= obj[name]; if (o!==n) { o= n; handler.call(obj); } }, 200); } } watchProperty(document.getElementById('myinput'), 'value', function() { alert('changed!'); }); 

这是非常令人不满的。 它不会响应Mozilla中用户驱动的更改,它只允许IE中每个对象监视一个属性,而在其他浏览器中,处理函数将在执行stream程中稍后调用。

重写脚本的部分设置value来调用setValue包装函数几乎肯定会更好,您可以监视要捕获的更改。

你可以添加一个普通的事件监听器到你的input字段就像这样。 (使用jQuery)

 $(myTextControl).change(function() { ... /* do appropriate event handling here */ ... }); 

好吧,考虑到改变input值的JavaScript不受你控制,这是困难的。 你剩下两个select:

1.)兼容Crossbrowser:使用连续检查值是否改变的函数来实现对input值的轮询。 (沿着这些线)。

 //at beginning before other scripts changes the value create a global variable var oldValue = myTextControl.value; function checkIfValueChanged() { if(myTextControl.value != oldValue) { $(myTextControl).trigger("change"); clearInterval(checker); } } //every 500ms check if value changed var checker = setInterval('checkIfValueChanged()', 500); 

注意 :如果您的脚本或用户也可以更改该值,则必须执行某些操作以避免多次触发更改事件。

如果该值可以通过外部脚本多次更改,只需让interval函数运行而不是取消它,只需更新oldValue;

2.) AFAIK不支持所有的浏览器(?testing你需要支持的)

你可以绑定到一个特殊的DOM Level 3Event: DOMAttrModified (在Firefox中,也许其他人也是我认为Opera也是这样,Safari?,Chrome ??),在IE中它有一个不同的名称propertychange (是专有的和不同的来自W3C的行为)

现在理想情况下,您可以结合使用这两个选项,并检查是否支持DOMAttrModifiedpropertychange ,并相应地使用或回退到轮询解决scheme。


阅读链接

W3C DOM突变事件

W3C DOMAttrModified事件

MSDN DHTML propertychange事件

jQuery的CSS属性监控插件更新

最后一个链接是一个基本上已经做了一个jQuery插件做我所描述的事情的人(未经我testing,只是作为参考)

尝试这个

 $('#myTextControl').bind('input', function(){ console.log('value changed'); }); 
 var oldVal = $('#myTextControl').val(); //Your script that changes the value if(oldVal != $('#myTextControl').val()) { //Your content has changed, do something } 

当你正在观看的元素有焦点时,你需要听键盘事件。