如何使用jQuery和文本输入框使这个实现:
myTextControl.value = someValue
我想触发一个事件来查看新值。
myTextControl.value = someValue
我想触发一个事件来查看新值。
我找不到合适的事件。
是的,确实没有这样的事件。
虽然有DOM变动事件,但它们跨浏览器支持不好,而且表单值的更改也无法触发这些事件,因为表单值并未反映在属性中(除了IE以外,由于一个错误,它可以反映在属性中)。
只有在Mozilla中,可以通过javascript的watch来捕捉脚本更改。在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中每个对象只允许一个观察属性,并且在其他浏览器中,处理函数将在执行流程中被调用得更晚。
几乎肯定更好的做法是重写脚本中设置value
的部分,改为调用setValue包装函数,您可以监视您想要捕获的更改。
obj.attachEvent('onpropertychange', ...)
处理多个处理程序,而在FF2+(包括FF2,在其中虽然文档记录为在DOM节点上不起作用,但我可以验证它的工作),Opera 9.5,Safari 3和Chrome 1中可以使用__defineSetter__('value', ...)
来实现类似的效果。与IE的实现唯一的分歧是IE不仅在编程设置时而且在键事件期间也触发处理程序。 - Crescent Fresh$(myTextControl).change(function() {
...
/* do appropriate event handling here */
...
});
好的,考虑到改变输入值的javascript不是由您控制的,这会让事情变得困难。您有两个选择:
1.) 跨浏览器兼容:使用一个函数来轮询输入值,并持续检查值是否发生了变化(类似于以下方式)。
//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);
注意: 如果您的脚本或用户可以更改值,则必须实现某些内容以捕获此,以便不会多次触发更改事件。
如果外部脚本可以多次更改值,请让间隔函数继续运行而不是取消它,并只更新oldValue;
2.) 据我所知,尚未被所有浏览器支持(?在您需要支持的浏览器上进行测试)
您可以绑定到特殊的DOM Level 3事件:DOMAttrModified
(在Firefox中,可能也有其他浏览器,我认为Opera也有,Safari??,Chrome??),而在IE中,它当然有一个不同的名称propertychange
(且是专有的,与W3C行为不同)
现在理想情况下,您可以结合这两个选项,检查是否支持DOMAttrModified
或propertychange
,并相应地使用或回退到轮询解决方案。
最后一个链接是一些人基本上已经制作了一个jQuery插件,该插件执行我描述的操作(未经过我的测试,仅作为参考提供)
使用Jquery
您还可以将这些事件监听器应用于输入字段,例如
$("yourid").on("change",function(){
//here do something
});
$("yourid").on("keypress",function(){
//here do something
});
$("yourid").on("keydown",function(){
//here do something
});
$("yourid").on("keyup",function(){
//here do something
});
试一下这个
$('#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
}
当你所观察的元素获得焦点时,你需要监听键盘事件。