我有一个文本输入,其内容是由脚本而不是用户更改的。所以我想在值改变时触发一个事件。我找不到合适的活动。我什至在 StackOverflow 上找到了这个,但这不是我正在寻找的解决方案。
如何使用 jQuery 和文本输入使其工作,其中值设置如下:
myTextControl.value = someValue
在这里,我想触发一个事件以查看新值。
我有一个文本输入,其内容是由脚本而不是用户更改的。所以我想在值改变时触发一个事件。我找不到合适的活动。我什至在 StackOverflow 上找到了这个,但这不是我正在寻找的解决方案。
如何使用 jQuery 和文本输入使其工作,其中值设置如下:
myTextControl.value = someValue
在这里,我想触发一个事件以查看新值。
我找不到合适的活动。
是的,没有一个。
有DOM Mutation Events,但它们不受跨浏览器的良好支持,并且无论如何都不会触发表单值,因为这些值没有反映在属性中(由于错误而在 IE 中除外)。
仅在 Mozilla 中,可以在 value 属性上设置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 中的每个对象有一个被监视的属性,而在其他浏览器中,处理程序函数将在执行流程中稍后被调用。
几乎可以肯定,重写设置value为调用 setValue 包装函数的脚本部分会更好,您可以监视要捕获的更改。
您可以像这样向输入字段添加普通事件侦听器。(使用jQuery)
$(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.) AFAIK 尚未被所有浏览器支持(?在您需要支持的浏览器上测试)
你可以绑定到一个特殊的 DOM Level 3Event :(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
}