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

IT技术 javascript jquery events input
2021-03-13 08:54:50

我有一个文本输入,其内容是由脚本而不是用户更改的。所以我想在值改变时触发一个事件。我找不到合适的活动。我什至在 StackOverflow 上找到了这个,但这不是我正在寻找的解决方案。

如何使用 jQuery 和文本输入使其工作,其中值设置如下:

myTextControl.value = someValue

在这里,我想触发一个事件以查看新值。

6个回答

我找不到合适的活动。

是的,没有一个。

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 包装函数的脚本部分会更好,您可以监视要捕获的更改。

我写了这个小片段来检测基于轮询的表单/输入更改:gist.github.com/Nemesarial/841b0aca7af762e459d63b77f93d63e1
2021-05-03 08:54:50
IE 可以通过 处理多个处理程序obj.attachEvent('onpropertychange', ...),并且__defineSetter__('value', ...)可以在 DOM 节点上使用,在 FF2+(包括 FF2,虽然它被记录为在 DOM 节点上不起作用,但我可以验证它的工作)、Opera 9.5、Safari 3 和 Chrome 1 中的效果类似。与 IE 实现的唯一区别是 IE 不仅在编程设置上而且在关键事件期间触发处理程序。
2021-05-05 08:54:50

您可以像这样向输入字段添加普通事件侦听器。(使用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 行为)

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


阅读链接

W3C DOM 突变事件

W3C DOMAttrModified 事件

MSDN DHTML 属性更改事件

jQuery CSS 属性监控插件更新

最后一个链接是某个人基本上已经制作了一个 jQuery 插件来完成我描述的事情(未经我测试,仅作为参考提供)

我无法访问更改控件的部分,因此无法手动触发该事件。这就是为什么我想要一个关于value变化的事件。
2021-05-12 08:54:50

使用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');
});
它仅在我自己更改值时才有效,但当输入由 datetimepicker 填充时它不起作用。我怎么能检测到呢?
2021-04-16 08:54:50
var oldVal = $('#myTextControl').val();

//Your script that changes the value

if(oldVal != $('#myTextControl').val())
{
//Your content has changed, do something
}
我需要一个事件......所以我知道它什么时候改变并做一些事情。在您的示例中,有一个明确的流程,而不是我的情况......该值可以在 AJAX 调用或其他任何事情上更改,我无法挂接,所以我需要触发一个事件。还是 .value 的装饰器?
2021-05-06 08:54:50