Как программно вызвать событие onchange на входе?

124

Как программно вызвать событие onchange на входе?

Я пробовал что-то вроде этого:

var code = ele.getAttribute('onchange');
eval(code);

Но моя конечная цель - запустить любые функции слушателя, а это, похоже, не работает. Также не обновляется просто атрибут «значение».

Soldarnal
источник

Ответы:

144

Создайте Eventобъект и передайте его dispatchEventметоду элемента:

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

Это вызовет запуск слушателей событий независимо от того, были ли они зарегистрированы путем вызова addEventListenerметода или путем установки onchangeсвойства элемента.


Если вы хотите, чтобы событие всплывало, вам нужно передать второй аргумент Eventконструктору:

var event = new Event('change', { bubbles: true });

Информация о совместимости браузера:

негодяй
источник
2
Да, MDN Создание и запуск событий - хороший ресурс!
Jakub Holý
1
Вот как это сделать правильно, изначально. Теперь поддерживается во всех браузерах: caniuse.com/#feat=dispatchevent
Виллем Малдер,
1
Это верный ответ на этот вопрос. Мы должны добиться этого современным способом.
Константин Ван
1
Я пытаюсь сделать эквивалент в IE11, но он не работает при попытке изменить поле ввода responsejs. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Бодоско
3
Почему все говорят, что это лучший ответ? Согласно связанному документу Event, даже текущая версия IE по- прежнему не поддерживает это.
jeff-h
96

В jQuery я в основном использую:

$("#element").trigger("change");
Danita
источник
2
тихс мне помогли! Я устанавливал значение флажка (установлен или нет) с помощью кода, и событие вообще не запускалось в IE, что бы я ни делал. Я пробовал blur () focus () и еще кое-что. после того, как я установил значение, которое я назвал триггером, и я также добавил событие щелчка для вызова триггера. Это вызывает несколько пожаров, но для меня это не имеет значения. В IE я добавляю флажки через код, и вам нужно дважды щелкнуть по ним, прежде чем сработает событие изменения. Спасибо за этот совет.
Дастин Дэвис
6
В качестве обновления $ ("# element"). Change (); делает то же самое, начиная с jquery 1.0.
CookieOfFortune
3
Обратите внимание, что это НЕ запускает собственный onchange. Он будет срабатывать только для всех слушателей onchange, которые были связаны через jQuery!
Виллем Малдер
Любая помощь здесь, пожалуйста? Ни одно из этих решений, похоже, не работает для меня .. stackoverflow.com/questions/51216332/…
Гейб
61

тьфу, не используйте eval ни для чего . Что ж, есть определенные вещи, но они крайне редки. Скорее, вы бы сделали это:

document.getElementById("test").onchange()

Дополнительные параметры см. Здесь: http://jehiah.cz/archive/firing-javascript-events-properly

Kolten
источник
3
eval для объективизации JSON;)
Аарон Пауэлл
3
json2.js для объективизации JSON! JSON.parse уже доступен в современных браузерах
jinglesthula
12
Этот метод работает только в том случае, если обработчик изменений был прикреплен с помощью установки «onchange». Он не генерирует «настоящее» событие, которое запускает обработчики событий w3c или microsoft. Пройдите по ссылке, чтобы узнать больше.
Стивен Нельсон
6
Я думаю, что этот ответ сейчас устарел, ответ Miscreant использует new Event(...)и dispatchEvent, похоже, в настоящее время является правильным решением.
Jakub Holý
4
Этот ответ устарел ; приведенный выше код не будет работать, если вы использовали Element.addEventListenerдля обработки событий. Чтобы добиться этого современным способом, см. Ответ @Miscreant.
Константин Ван
23

По какой-то причине ele.onchange () выбрасывает для меня исключение «метод не найден» в IE на моей странице, поэтому я в итоге использовал эту функцию из ссылки, предоставленной Kolten, и вызвал fireEvent (ele, 'change'), которая сработала :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

Однако я создал тестовую страницу, подтверждающую, что вызов должен работать onchange ():

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

Изменить: Причина, по которой ele.onchange () не работает, заключалась в том, что я фактически ничего не объявил для события onchange. Но fireEvent все еще работает.

Soldarnal
источник
2
Мне этот метод обнаружения браузера (по обнаружению объектов) нравится больше, чем приведенный мною пример.
Крис Макдональд,
Это больше не работает для Firefox 23: «element.dispatchEvent не является функцией»
Оливер
4
Привет, гуглеры. Это 2016 год! В настоящее время мы пишем код element.dispatchEvent(new Event('change', true, true))вместо всего этого загадочного и в основном устаревшего createEventи initEventпрочего.
ericoco
3

Это наиболее правильный ответ для IE и Chrome:

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);
Питер Ло
источник
2

Взято из нижней части QUnit

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

Вы, конечно, можете заменить содержимое $ .browser на собственные методы обнаружения браузера, чтобы сделать его независимым от jQuery.

Чтобы использовать эту функцию:

var event;
triggerEvent(ele, "change", event);

Это в основном вызовет реальное событие DOM, как если бы что-то действительно изменилось.

Крис Макдональд
источник
1

Если вы добавите все свои события с помощью этого фрагмента кода:

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

то вы можете просто использовать element.on<EVENTNAME>()where <EVENTNAME>- имя вашего события, и это вызовет все события с<EVENTNAME>

Wntiv Senyh
источник
-2

Для запуска любого события в Javascript.

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})
Хариш Сила
источник
3
это прослушивает события, а не запускает их.
invalidusername
-4

если вы используете jQuery, у вас будет:

$('#elementId').change(function() { alert('Do Stuff'); });

или MS AJAX:

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

Или в необработанном HTML-коде элемента:

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

Перечитав вопрос, я думаю, что пропустил то, что нужно было делать. Я никогда не находил способ обновить элемент DOM таким образом, чтобы вызвать событие изменения, лучше всего использовать отдельный метод обработчика событий, например:

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

Поскольку вы уже пишете метод JavaScript, который изменит его, нужно вызвать только 1 дополнительную строку.

Или, если вы будете с помощью платформы Microsoft AJAX вы можете получить доступ ко всем обработчикам событий с помощью:

$get('elementId')._events

Это позволит вам поработать в стиле отражения, чтобы найти нужный обработчик событий.

Аарон Пауэлл
источник
1
Я считаю, что он хочет запустить фактическое событие, а не запускать функцию, когда событие запускается ... я думаю . lol
Колтен
-5

Используя JQuery, вы можете делать следующее:

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");
СТАЛЬ ITBOY
источник
undefined не является функцией.
Христо Венев