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的行为)
现在理想情况下,您可以结合使用这两个选项,并检查是否支持DOMAttrModified
或propertychange
,并相应地使用或回退到轮询解决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 }
当你正在观看的元素有焦点时,你需要听键盘事件。