Подтвердить что ты не робот

Onchange событие не срабатывает, когда изменение происходит от другой функции

У меня есть входной текст, который получает его значение из функции Javascript (таймер с обратным отсчетом).

Я хочу вызвать событие, когда входной текст равен 0, поэтому я использую change eventListener.

К сожалению, похоже, что это событие не вызывается, когда изменение происходит из функции javascript.

Как я могу заставить событие изменения работать, даже если изменение исходит от Javascript, а не от пользователя?

4b9b3361

Ответ 1

Из точное руководство:

изменить
Событие изменения происходит, когда элемент управления теряет фокус ввода, и его значение было изменено с момента получения фокуса. Это событие действует для INPUT, SELECT и TEXTAREA. элемент.

Когда вы изменяете значение ввода текста через код, событие изменения не будет запущено, потому что нет изменения фокуса. Вы можете инициировать событие самостоятельно, но createEvent и dispatchEvent, например:

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

И живая версия: http://jsfiddle.net/ambiguous/nH8CH/

Ответ 2

В функции, которая изменяет значение, вручную запускайте событие change.

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

Ответ 3

Более многоразовый вариант:

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);
    }
};

Ответ 5

Просто переопределите свойство "value" узла, используя getAttribute("value") и setAttribute("value", newValue), в методах получения и установки, а также отправьте событие "change" в конце средства установки. Например:

myNode.onchange = e => console.log("Changed!", e.target.value);

Object.defineProperty(myNode, "value", {
  get: () => myNode.getAttribute("value"),
  set(newValue) {
    myNode.setAttribute("value", newValue);
    myNode.dispatchEvent(new Event("change")); //or define the event earlier, not sure how much of a performance difference it makes though
  }
})

var i = 0;
setTimeout(function changeIt() {
    if(i++ < 10) {
        myNode.value = i;
        setTimeout(changeIt, 1000);
    }
}, 1)
<input id="myNode">