Javascript JS事件:挂接文本输入上的值更改事件

Javascript JS事件:挂接文本输入上的值更改事件,javascript,jquery,events,input,Javascript,Jquery,Events,Input,我有一个文本输入,它的内容是由脚本而不是用户更改的。所以我想在值更改时触发一个事件。我找不到合适的活动。 我甚至找到了,但这不是我想要的解决方案 如何使用jQuery和文本输入进行此操作,其中的值设置如下: myTextControl.value = someValue 在这里,我想触发一个事件以查看新值。当您正在观看的元素具有焦点时,您需要监听键盘事件。您可以像这样向输入字段添加一个普通事件侦听器。(使用jQuery) var oldVal = $('#myTextControl').val

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

如何使用jQuery和文本输入进行此操作,其中的值设置如下:

myTextControl.value = someValue

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

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

您可以像这样向输入字段添加一个普通事件侦听器。(使用jQuery)

var oldVal = $('#myTextControl').val();

//Your script that changes the value

if(oldVal != $('#myTextControl').val())
{
//Your content has changed, do something
}

好吧,考虑到更改输入值的javascript不是由您控制的,这会变得很困难。您将有两个选择:

1。)交叉浏览器兼容:使用一个函数实现对输入值的轮询,该函数可连续检查值是否更改。(沿着这些路线的东西)

注意:如果您的脚本或用户也可以更改该值,则必须实现某种方法来捕获该值,以避免多次触发更改事件

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

2。)AFAIK尚未被所有浏览器支持(在需要支持的浏览器上测试)

您可以绑定到一个特殊的DOM级别3Event:
domatrtModified
(在Firefox中,可能其他人也有,我认为Opera也有,Safari??,Chrome??),当然在IE中它有一个不同的名称
propertychange
(并且是专有的,与W3C行为不同)

现在,理想情况下,您可以将这两个选项结合起来,检查是否存在对
domatrtmodified
propertychange
的支持,并相应地使用或回退到轮询解决方案


阅读链接

最后一个链接是一个家伙,他基本上已经制作了一个jQuery插件来完成我描述的事情(我没有测试过,只是作为参考)

我找不到合适的活动

是的,没有

有,但它们在跨浏览器中不受很好的支持,并且无论如何也不要为表单值激发,因为这些值不会反映在属性中(由于错误而在IE中除外)

仅在Mozilla中,可以在value属性上设置JavaScript以捕获脚本化的更改。仅在IE中,可以将JScript处理程序设置为捕获脚本化和用户驱动的更改。在其他浏览器中,您必须使用自己的间隔轮询器来查找更改

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中只允许每个对象有一个受关注的属性,而在其他浏览器中,处理程序函数将在执行流中稍后调用

几乎可以肯定的是,最好重写脚本中设置值的部分,以调用setValue包装函数,这样可以监视要捕获的更改。

试试这个

$('#myTextControl').bind('input', function(){
  console.log('value changed');
});
使用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
});

正如问题中所暗示的,这不是通过用户交互实现的,那么您的答案如何有效呢?“”“我有一个文本输入,它的内容是由脚本而不是用户更改的。”“”我需要一个事件。。。所以我知道它什么时候变了,并做些改变。在您的示例中,有一个显式流,而不是我的情况。。。该值可以在AJAX调用或其他任何情况下更改,我无法挂接该值,因此我需要触发一个事件。或.value的装饰程序?我无法访问控件更改的部分,因此无法手动触发该事件。这就是为什么我想要一个关于值更改的事件。注意:我无法访问控件更改的部分,因此无法手动触发更改事件。@Esteban Feldman:您说的是相互冲突的事情。首先,“我想在这里触发一个事件以查看新值”,然后“我无法手动触发一个更改事件”。是哪一个?您找到解决方案了吗?请回答你的问题。很好的问题。。。我也在以编程方式处理更改输入值时遇到问题:(IE可以通过
obj处理多个处理程序。attachEvent('onpropertychange',…)
,和
\uuuuu defineSetter_uu('value',…)
可以在DOM节点上使用,在FF2+中效果类似(包括FF2,尽管它在DOM节点上被记录为不起作用,但我可以验证它是否有效)、Opera 9.5、Safari 3和Chrome 1。IE实现的唯一不同之处在于IE不仅在编程设置时触发处理程序,而且在关键事件期间也会触发处理程序。我编写了这个小片段,以检测基于轮询的表单/输入更改:它只在我自己更改值时起作用,但在datetimepicker填充输入时不起作用。我怎么能发现呢?
$('#myTextControl').bind('input', function(){
  console.log('value changed');
});
$("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
});