Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何观察表单元素属性?_Javascript_Forms_Select_Input_Properties - Fatal编程技术网

Javascript 如何观察表单元素属性?

Javascript 如何观察表单元素属性?,javascript,forms,select,input,properties,Javascript,Forms,Select,Input,Properties,我有一个表单,其中可以以多种不同的方式更新input和select等元素(用户输入、复制/粘贴、以编程方式添加或删除选择选项、以编程方式更新值、自动完成)。我宁愿观察元素属性的变化,而不是试图捕捉所有这些动作 最简单的方法是依赖propertychange事件,不幸的是,它只适用于IE10及以下版本 对于IE 11和Chrome等浏览器,我有哪些选择?我听说过像对象的Object.defineProperty这样的方法,但我不确定它将如何应用于我的表单元素。我还研究了变异观察者,但我看不出他们对

我有一个表单,其中可以以多种不同的方式更新
input
select
等元素(用户输入、复制/粘贴、以编程方式添加或删除选择选项、以编程方式更新值、自动完成)。我宁愿观察元素属性的变化,而不是试图捕捉所有这些动作

最简单的方法是依赖
propertychange
事件,不幸的是,它只适用于IE10及以下版本

对于IE 11和Chrome等浏览器,我有哪些选择?我听说过像对象的
Object.defineProperty
这样的方法,但我不确定它将如何应用于我的表单元素。我还研究了
变异观察者
,但我看不出他们对输入元素有什么帮助

任何指点都将不胜感激

[编辑]我收到的评论是,这个问题太宽泛了。我明白,我其实希望已经有一个明确的答案,因为在我看来,这是一个如此普遍的要求


更具体地说,下面是我必须处理的直接问题:如何在IE 11和Chrome中检测对输入元素值的编程更改?对于选择框,使用
更改
事件。您也可以使用输入框绑定到同一事件,但请记住,
text
类型的输入只会在模糊后触发
change
事件(如果我没有记错的话)。为此,您可能需要查看自定义插件,例如


另外,如果使用jQuery.val()修改输入的值,您可能必须使用
$(“input.my input”).change()显式触发更改事件
无参数我认为您正在寻找的解决方案不存在,至少不跨浏览器,因此,这个问题的任何解决方案都会涉及到某种约定/代码规则

如果您可以控制所有相关的代码,这应该不是什么大问题;如果不这样做,则可能需要使用setInterval()来轮询所关心的字段

康斯坦丁的回答涵盖了与直接用户输入相关的大多数情况。对于编程更改,如果使用jQuery之类的库,则可以拦截调用:

var oldValFn = $.fn.val;
$.fn.val = function() {
    var result = oldValFn.apply(this, arguments);
    if(arguments.length > 0) {
        // value is being set to arguments[0]
    } else {
        // value is being retrieved, you probably don't do anything here.
    }
    return result;
};
如果您不愿意等待模糊事件,您可能还需要添加一个委托的keydown/keypress处理程序来报告文本字段的中间更改:

var oldVal;
$(document).on('keydown keypress', function(e) {
    $(e.target).val(); // this will be the pre-change value
    setTimeout(function() {
        $(e.target).trigger('change'); // the value will be updated _after_ the event finished bubbling
    });
})

你不能为所有的
onchange
创建一个中心处理程序吗?这个问题虽然可以更具体一点,但不值得否决imho@YuriyGalanter
onchange
事件未看到编程更改显示关于:?还是?@Ian thx为指针。IE11问题是一个新问题,到目前为止,我还没有找到任何帖子或答案来解决它。问题是,变革活动只满足了我一半的需求。它们不会对程序的更改做出反应。我的最后一段正是关于这一点的:)我以前曾多次处理过这个问题,并且在我的情况下,每次必须更改输入程序的值时,都必须保留调用“update”函数的时间,除了jQuery或其他人编写的应用程序之外,其他库也可能会进行更改,这就是我试图观察结果的原因。扩展内置函数(在本例中是jQuery提供的.val函数)@KonstantinK通常不是一个好主意,除非您有理由,否则它没有任何问题。这个答案似乎保留在原来的功能中(尽管可能需要检查),并且做一些自定义的事情如果你想链接到支持你观点的东西,我很乐意阅读。只要您使用.apply(这个,参数)通过原始函数委托调用,并将原始结果返回,我就不会遇到任何问题。如果您真的想要所询问的功能,您可能没有选择。在我的情况下,这些更改可能是由jQuery以外的库或其他人编写的应用程序进行的,这就是为什么我尝试观察结果的原因。“我同意投票技术,这是我目前一直在使用的,但我希望我能做得更好。”米凯德沃兹说,这是一个有趣的观点。我一直认为“不要扩展本机函数/对象”这条规则是理所当然的,没有太多疑问。快速搜索产生了这样的结果:(实际上没有任何参考资料)。具有讽刺意味的是,我曾经这样做过,因为没有其他方法:类似的方法。我认为这是一个有趣的问题,我找不到任何相关的来源,所以我要创建一个新的线程