Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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 当更改来自另一个函数时,onchange事件不会触发_Javascript_Dom Events - Fatal编程技术网

Javascript 当更改来自另一个函数时,onchange事件不会触发

Javascript 当更改来自另一个函数时,onchange事件不会触发,javascript,dom-events,Javascript,Dom Events,我有一个输入文本,从Javascript函数(带倒计时的计时器)获取他的值 我想在输入文本为0时引发一个事件,因此我使用ChangeEventListener 不幸的是,当更改来自javascript函数时,它似乎没有引发事件 如何强制更改事件工作,即使更改来自Javascript而不是用户?在更改值的函数中,手动触发更改事件 var e = document.createEvent('HTMLEvents'); e.initEvent('change', false, false); some

我有一个输入文本,从Javascript函数(带倒计时的计时器)获取他的值

我想在输入文本为0时引发一个事件,因此我使用ChangeEventListener

不幸的是,当更改来自javascript函数时,它似乎没有引发事件


如何强制更改事件工作,即使更改来自Javascript而不是用户?

在更改值的函数中,手动触发
更改事件

var e = document.createEvent('HTMLEvents');
e.initEvent('change', false, false);
some_input_element.dispatchEvent(e);
从:

改变
当控件失去输入焦点且自获得焦点后其值已被修改时,将发生更改事件。此事件对INPUT、SELECT和TEXTAREA有效。元素

通过代码修改文本输入的值时,不会触发更改事件,因为没有焦点更改。您可以通过和自己触发事件,例如:

el = document.getElementById('x');
ev = document.createEvent('Event');
ev.initEvent('change', true, false);
el.dispatchEvent(ev);

和一个实时版本:

一个更可重用的选项:

function simulate_event(eventName, element) {
    // You could set this into the prototype as a method.
    var event;

    if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent(eventName, true, true);
    } else {
        event = document.createEventObject();
        event.eventType = eventName;
    };

    event.eventName = eventName;

    if (document.createEvent) {
        element.dispatchEvent(event);
    } else {
        element.fireEvent("on" + event.eventName, event);
    }
};

现在是2018年,initEvent()似乎已被弃用:

我认为你现在可以在一条航线上触发这一事件: 元素。dispatchEvent(新事件(“更改”)

只需在getter和setter中使用
getAttribute(“value”)
setAttribute(“value”,newValue)
重新定义节点的“value”属性,并在setter的末尾调度“change”事件。例如:

el = document.getElementById('x');
ev = document.createEvent('Event');
ev.initEvent('change', true, false);
el.dispatchEvent(ev);
myNode.onchange=e=>console.log(“Changed!”,e.target.value);
Object.defineProperty(myNode,“值”{
get:()=>myNode.getAttribute(“值”),
设置(新值){
setAttribute(“值”,newValue);
myNode.dispatchEvent(new Event(“change”);//或更早定义事件,但不确定它对性能有多大影响
}
})
var i=0;
setTimeout(函数changeIt(){
if(i++<10){
myNode.value=i;
setTimeout(changeIt,1000);
}
},1)

您可以使用
按键
事件,而不是使用
更改


这是因为
change
事件只有在不再聚焦时才会触发-当您从输入标签中单击时。

如果您使用任何现代事件监听方法,这将不起作用;仅当使用旧的
onchange
属性时,它才起作用。您应该使用DOM事件API来触发事件。@Delan:您能告诉我我很长时间没有使用原始JavaScript了吗?我会修好的。它需要是
HTMLEvents
?jQuery版本显然使用了
Event
,我能看到的唯一区别是DOM级别2和级别3。据我所知,
HTMLEvents
Event
Events
是同义词。似乎是官方的,
Events
可能在一些浏览器中出现,以匹配
hasFeature
多元化。