以编程方式更新时,不会调用HTML JavaScript onChange处理程序

以编程方式更新时,不会调用HTML JavaScript onChange处理程序,javascript,html,onchange,Javascript,Html,Onchange,我发现HTML文本框和JavaScript有一个奇怪的异常,我将其缩小为HTML/JavaScript特性,我希望有人能教我 我已经下载并实现了一个日历插件,它创建了一个带有日历的简单图层,并在选择时将所选日期传递回文本框 我想做的是在文本框更改时捕获(使用onchange),然后调用Ajax函数来更新数据库 问题是,onchange永远不会被调用。。。我已经能够用下面这个非常简单的代码来证明它。。。单击按钮时,它会更改值,该值将触发onchange并显示一个警报框 <input type

我发现HTML文本框和JavaScript有一个奇怪的异常,我将其缩小为HTML/JavaScript特性,我希望有人能教我

我已经下载并实现了一个日历插件,它创建了一个带有日历的简单图层,并在选择时将所选日期传递回文本框

我想做的是在文本框更改时捕获(使用onchange),然后调用Ajax函数来更新数据库

问题是,onchange永远不会被调用。。。我已经能够用下面这个非常简单的代码来证明它。。。单击按钮时,它会更改值,该值将触发onchange并显示一个警报框

<input type="button" name="setValue" id="setValue" value="setValue" onClick="document.getElementById('textinput').value='Updated'">&nbsp;
<input type="button" name="clearValue" id="clearValue" value="clearValue" onClick="document.getElementById('textinput').value=''"><br>
<input type="text" name="textinput" id="textinput" onChange="alert(this.name)">



这是标准吗?有解决方法吗?

为什么不创建一个自定义函数,如下所示:

function change( val ){
    var el = document.getElementById( 'textinput' );
    el.value = val;
    alert( val );
}

onchange事件不是由textinput值的编程更改触发的。您必须在自己更改值后调用要执行的代码。

一旦更改SDoE,在字段失去焦点之前不会被调用/另一个editfield获得焦点。

您最好的办法是将处理更改的代码放入函数中(例如,
handleTextChange
),然后从
change
事件处理程序和直接在代码中进行更改时调用该函数

HTML:


离题一些离题评论:

  • 最好使用
    onchange
    ,而不是
    onchange
    。在HTML中,这并不重要;在XHTML中,它很重要,元素上的反射属性总是小写的,所以。。。而且打字更容易。:-)
  • 除非您有充分的理由不这样做,否则我建议在事后连接事件处理程序,而不是使用内联HTML属性。由于浏览器的差异,使用库、或最容易实现这一点,但当然,库可以做的任何事情,您都可以自己做,这可能需要更长的时间,并且接受的测试更少。:-)
文本框和textarea元素上的onchange事件只有在元素失去焦点时才会触发,如果它的值现在不是它获得焦点时的值。

这是一个非常古老的线程,答案可以在别处找到,但我想我会在这里发布它,因为我是通过研究发现它的

可以通过以下几种方式以编程方式调用元素的onChange调用:

document.getElementById("elementID").onchange();


@戈米:我对你现在删除的答案的第二个评论是不正确的。仅供参考。可能的副本
function changeField(id, value) {
    var field = document.getElementById(id);
    if (field) {
        field.value = value;
        handleFieldChange(field);
    }
}
document.getElementById("elementID").onchange();
var element = document.getElementById('elementID');
var event = new Event('change');
element.dispatchEvent(event);