Как вызвать событие в JavaScript?

Я добавил событие в текстовое поле, используя addEventListener. Работает нормально. Моя проблема возникла, когда я хотел вызвать событие программно из другой функции.

Как я могу это сделать?


person KoolKabin    schedule 22.03.2010    source источник
comment
В Mozilla есть очень хорошая статья, объясняющая Создание и запуск событий в Javascript. Надеюсь, это поможет!   -  person Ricky Stam    schedule 16.10.2013
comment
Измените принятый ответ на этот, он более актуален.   -  person Michał Perłakowski    schedule 02.04.2016
comment
@RickyStam Похоже, что статья MDN перемещена сюда   -  person styfle    schedule 05.12.2016


Ответы (18)


Вы можете использовать fireEvent в IE 8 или ниже, а dispatchEvent от W3C наиболее < / em> другие браузеры. Чтобы создать событие, которое вы хотите запустить, вы можете использовать createEvent или createEventObject в зависимости от браузера.

Вот фрагмент кода, который не требует пояснений (из прототипа), который запускает событие dataavailable на element:

var event; // The custom event that will be created
if(document.createEvent){
    event = document.createEvent("HTMLEvents");
    event.initEvent("dataavailable", true, true);
    event.eventName = "dataavailable";
    element.dispatchEvent(event);
} else {
    event = document.createEventObject();
    event.eventName = "dataavailable";
    event.eventType = "dataavailable";
    element.fireEvent("on" + event.eventType, event);
}
person Alsciende    schedule 22.03.2010
comment
Не забывайте, что только версия IE имеет впереди 'on' (я сначала это пропустил) - person hugomg; 15.09.2011
comment
Что здесь содержится в переменной eventName? - person NeDark; 15.09.2011
comment
@Alsciende, как я могу прикрепить обработчик событий к этому настраиваемому событию? - person ThemeZ; 26.04.2012
comment
Я считаю, что dataavailable должен быть в переменной eventName. - person fearphage; 13.12.2012
comment
Да, dataavailable должны быть в eventName, и memo также должно быть определено (определение {} в порядке). - person Charles; 05.07.2013
comment
Думаю, вопрос в том, откуда взялось eventName? В этом коде он не определен. Должны ли быть доступны данные? Если да, отредактируйте ответ. - person B T; 28.08.2013
comment
Internet Explorer 9+ обрабатывает createEvent и dispatchEvent, поэтому в этих операторах if нет необходимости. - person Blake; 04.09.2013
comment
Этот пример даже не работает, см. Мой ответ: stackoverflow.com/a/20548330/407213 - person Dorian; 12.12.2013
comment
Я не понимаю, является ли это кроссбраузерным методом. Это? - person nicholaswmin; 10.05.2014
comment
fireEvent в IE, какую версию IE он поддерживает? - person georgelviv; 03.05.2015
comment
Похоже, процесс создания настраиваемых событий в какой-то момент может измениться - см. В статье MDN. Но пока этот ответ у меня сработал, так что спасибо! - person Brendan; 03.11.2015
comment
Последние строки должны вызывать document.dispatchEvent и document.fireEvent соответственно. - person Andreas Haufler; 23.02.2016
comment
document.createEvent кажется устаревшим в пользу new Event: developer.mozilla. org / en-US / docs / Web / API / Document / createEvent - person Ciro Santilli 新疆再教育营六四事件ۍ 01.06.2016
comment
не работает на ie11 через виртуальный бокс на хосте Mac: github.com/lingtalfi/browsers-behaviours/blob/master/ - person ling; 06.10.2016
comment
или: $ (селектор) .change (); - person Andrew; 30.08.2017
comment
@CiroSantilli 郝海东 冠状 病 六四 事件 法轮功 Document.createEvent () не является устаревшим, но Event.initEvent () является устаревшим, см. MDN. - person jak.b; 20.11.2020

Рабочий пример:

// Add an event listener
document.addEventListener("name-of-event", function(e) {
  console.log(e.detail); // Prints "Example of an event"
});

// Create the event
var event = new CustomEvent("name-of-event", { "detail": "Example of an event" });

// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);

Для polyfill старых браузеров и более сложных примеров см. Документы MDN.

См. Таблицы поддержки для EventTarget.dispatchEvent и CustomEvent < / а>.

person Dorian    schedule 12.12.2013
comment
@AngelPolitis: потому что он был написан после того, как предыдущий был уже принят, и человек, который написал вопрос (@KoolKabin), вероятно, не перечитал ответы - person Dorian; 16.07.2016
comment
И потому что его спросили в 2010 году - person DarkNeuron; 11.07.2017
comment
Не будет работать ни с одной версией IE (caniuse.com/#feat=customevent). См. Мой ответ для исправления. - person Yarin; 05.03.2018
comment
Примечание для будущих читателей, detail является свойством Event, поэтому назначьте ему любые данные, к которым вы хотите получить доступ на другом конце, и доступ event.detail. +1 - person daka; 29.02.2020

Если вы не хотите использовать jQuery и вас не особенно беспокоит обратная совместимость, просто используйте:

let element = document.getElementById(id);
element.dispatchEvent(new Event("change")); // or whatever the event type might be

См. Документацию здесь и здесь.

РЕДАКТИРОВАТЬ: В зависимости от настроек вы можете добавить bubbles: true:

let element = document.getElementById(id);
element.dispatchEvent(new Event('change', { 'bubbles': true }));
person e18r    schedule 29.05.2018
comment
Это должен быть принятый ответ, поскольку он не использует устаревшие методы, такие как initEvent (). - person user2912903; 10.02.2019
comment
Хорошее решение, но имейте в виду, что это не будет работать в IE11. Затем вы должны использовать CustomEvent и соответствующий полифилл. - person Fabian von Ellerts; 19.03.2019
comment
Лучше, чем выбранный ответ - person WitnessTruth; 18.04.2019

если вы используете jQuery, вы можете просто сделать

$('#yourElement').trigger('customEventName', [arg0, arg1, ..., argN]);

и справиться с этим с

$('#yourElement').on('customEventName',
   function (objectEvent, [arg0, arg1, ..., argN]){
       alert ("customEventName");
});

где «[arg0, arg1, ..., argN]» означает, что эти аргументы являются необязательными.

person Hilder Vitor Lima Pereira    schedule 06.07.2014
comment
Правильный синтаксис: $ ('# yourElement'). Trigger ('customEventName', [arg0, arg1, ..., argN]); Вы забыли [] во втором параметре - person harry; 09.07.2014

Если вы поддерживаете IE9 +, вы можете использовать следующее. Та же концепция включена в Возможно, вам не понадобится jQuery.

function addEventListener(el, eventName, handler) {
  if (el.addEventListener) {
    el.addEventListener(eventName, handler);
  } else {
    el.attachEvent('on' + eventName, function() {
      handler.call(el);
    });
  }
}

function triggerEvent(el, eventName, options) {
  var event;
  if (window.CustomEvent) {
    event = new CustomEvent(eventName, options);
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, options);
  }
  el.dispatchEvent(event);
}

// Add an event listener.
addEventListener(document, 'customChangeEvent', function(e) {
  document.body.innerHTML = e.detail;
});

// Trigger the event.
triggerEvent(document, 'customChangeEvent', {
  detail: 'Display on trigger...'
});


Если вы уже используете jQuery, вот версия кода, приведенного выше, для jQuery.

$(function() {
  // Add an event listener.
  $(document).on('customChangeEvent', function(e, opts) {
    $('body').html(opts.detail);
  });

  // Trigger the event.
  $(document).trigger('customChangeEvent', {
    detail: 'Display on trigger...'
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

person Mr. Polywhirl    schedule 17.03.2016
comment
Это не будет работать ни в одной версии IE, поскольку window.CustomEvent существует, но его нельзя вызвать в качестве конструктора: caniuse. ru / # search = CustomEvent;) - person SidOfc; 23.06.2017

Я искал события щелчка, mousedown и mouseup при наведении курсора с помощью JavaScript. Я нашел ответ, предоставленный Хуаном Мендесом. Чтобы получить ответ, нажмите здесь.

Щелкните здесь, чтобы увидеть живую демонстрацию и код ниже:

function fireEvent(node, eventName) {
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
    var doc;
    if (node.ownerDocument) {
        doc = node.ownerDocument;
    } else if (node.nodeType == 9) {
        // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
        doc = node;
    } else {
        throw new Error("Invalid node passed to fireEvent: " + node.id);
    }

    if (node.dispatchEvent) {
        // Gecko-style approach (now the standard) takes more work
        var eventClass = "";

        // Different events have different event classes.
        // If this switch statement can't map an eventName to an eventClass,
        // the event firing is going to fail.
        switch (eventName) {
        case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
        case "mousedown":
        case "mouseup":
            eventClass = "MouseEvents";
            break;

        case "focus":
        case "change":
        case "blur":
        case "select":
            eventClass = "HTMLEvents";
            break;

        default:
            throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
            break;
        }
        var event = doc.createEvent(eventClass);

        var bubbles = eventName == "change" ? false : true;
        event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable.

        event.synthetic = true; // allow detection of synthetic events
        // The second parameter says go ahead with the default action
        node.dispatchEvent(event, true);
    } else if (node.fireEvent) {
        // IE-old school style
        var event = doc.createEventObject();
        event.synthetic = true; // allow detection of synthetic events
        node.fireEvent("on" + eventName, event);
    }
};
person S.Mishra    schedule 29.10.2015

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

Что бы ни делал ваш слушатель событий, переместите его в функцию и вызовите эту функцию из слушателя событий.

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

Я считаю, что это менее "интенсивное использование кода" и его легче читать.

person Kirby L. Wallace    schedule 15.04.2016
comment
Что, если вы хотите сделать несколько разных вещей для одного и того же события (или, в вашем случае, функции обратного вызова) в зависимости от контекста? :) Это хорошая альтернатива, но это больше похоже на комментарий, чем на ответ, поскольку OP хочет знать, как программно запускать событие, а не использовать обратный вызов :) - person SidOfc; 23.06.2017
comment
Вы совершенно правы, что это должен был быть комментарий, а не ответ. Почему? Потому что ... эээ ... он не отвечает на вопрос, который был задан на самом деле. Хороший звонок. Что касается вашего собственного вопроса, я бы сказал, что это отличная возможность для конструкторов в JavaScript! ;-) Но без них, я бы сказал, отправьте аргумент с вызовом функции и позвольте ему использовать его для определения того, что функция должна делать. - person Kirby L. Wallace; 12.09.2017

Изменен ответ @Dorian для работы с IE:

document.addEventListener("my_event", function(e) {
  console.log(e.detail);
});

var detail = 'Event fired';

try {

    // For modern browsers except IE:
    var event = new CustomEvent('my_event', {detail:detail});

} catch(err) {

  // If IE 11 (or 10 or 9...?) do it this way:

    // Create the event.
    var event = document.createEvent('Event');
    // Define that the event name is 'build'.
    event.initEvent('my_event', true, true);
    event.detail = detail;

}

// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);

FIDDLE: https://jsfiddle.net/z6zom9d0/1/

СМОТРИ ТАКЖЕ:
https://caniuse.com/#feat=customevent < / а>

person Yarin    schedule 05.03.2018
comment
в вашем комментарии Для современных браузеров, кроме IE, я думаю, за исключением того, что IE избыточен;) - person vir us; 19.07.2020

Я просто использовал следующее (кажется, намного проще):

element.blur();
element.focus();

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

person Aleksander Lech    schedule 07.01.2016
comment
При этом не учитывается, что это за мероприятие. Размытие и фокусировка могут вызвать событие, но не всегда. Это заманчивые ошибки. - person Mardok; 26.01.2016
comment
Это также относится к element.click(). - person AxeEffect; 13.06.2017
comment
Это устранило странную проблему для моего приложения Angular / Cordova в Android, когда текстовое поле отказывалось очищаться. Тогда спасибо. - person DarkNeuron; 11.07.2017
comment
хороший. простой и короткий - person Nikhil sHETH; 26.06.2021

Принятый ответ не сработал для меня, ни один из ответов createEvent не сработал.

В конце концов, у меня сработало:

targetElement.dispatchEvent(
    new MouseEvent('click', {
        bubbles: true,
        cancelable: true,
        view: window,
}));

Here’s a snippet:

const clickBtn = document.querySelector('.clickme');
const viaBtn = document.querySelector('.viame');

viaBtn.addEventListener('click', function(event) {
    clickBtn.dispatchEvent(
        new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window,
    }));
});

clickBtn.addEventListener('click', function(event) {
    console.warn(`I was accessed via the other button! A ${event.type} occurred!`);
});
<button class="clickme">Click me</button>

<button class="viame">Via me</button>

Из чтения: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent

person Ming    schedule 25.11.2019

Вы можете использовать эту функцию, которую я скомпилировал вместе.

if (!Element.prototype.trigger)
  {
    Element.prototype.trigger = function(event)
    {
        var ev;

        try
        {
            if (this.dispatchEvent && CustomEvent)
            {
                ev = new CustomEvent(event, {detail : event + ' fired!'});
                this.dispatchEvent(ev);
            }
            else
            {
                throw "CustomEvent Not supported";
            }
        }
        catch(e)
        {
            if (document.createEvent)
            {
                ev = document.createEvent('HTMLEvents');
                ev.initEvent(event, true, true);

                this.dispatchEvent(event);
            }
            else
            {
                ev = document.createEventObject();
                ev.eventType = event;
                this.fireEvent('on'+event.eventType, event);
            }
        }
    }
  }

Инициируйте событие ниже:

var dest = document.querySelector('#mapbox-directions-destination-input');
dest.trigger('focus');

Смотреть событие:

dest.addEventListener('focus', function(e){
   console.log(e);
});

Надеюсь это поможет!

person Ifeanyi Amadi    schedule 06.09.2018

Вы можете использовать приведенный ниже код для запуска события с помощью метода Element:

if (!Element.prototype.triggerEvent) {
    Element.prototype.triggerEvent = function (eventName) {
        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) {
            this.dispatchEvent(event);
        } else {
            this.fireEvent("on" + event.eventType, event);
        }
    };
}

if (!Element.prototype.triggerEvent) {
    Element.prototype.triggerEvent = function (eventName) {
        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) {
            this.dispatchEvent(event);
        } else {
            this.fireEvent("on" + event.eventType, event);
        }
    };
}

var input = document.getElementById("my_input");
var button = document.getElementById("my_button");

input.addEventListener('change', function (e) {
    alert('change event fired');
});
button.addEventListener('click', function (e) {
    input.value = "Bye World";
    input.triggerEvent("change");
});
<input id="my_input" type="input" value="Hellow World">
<button id="my_button">Change Input</button>

person iProDev    schedule 13.12.2018

Самый эффективный способ - вызвать ту же самую функцию, которая была зарегистрирована в addEventListener напрямую.

Вы также можете вызвать фальшивое событие с помощью CustomEvent и co.

Наконец, некоторые элементы, такие как <input type="file">, поддерживают метод .click().

person Walle Cyril    schedule 20.11.2017

var btn = document.getElementById('btn-test');
var event = new Event(null);

event.initEvent('beforeinstallprompt', true, true);
btn.addEventListener('beforeinstallprompt', null, false);
btn.dispatchEvent(event);

это немедленно вызовет событие 'beforeinstallprompt'

person Dan Alboteanu    schedule 26.05.2018

HTML

<a href="demoLink" id="myLink"> myLink </a>
<button onclick="fireLink(event)"> Call My Link </button>

JS

// click event listener of the link element --------------  
document.getElementById('myLink').addEventListener("click", callLink);
function callLink(e) {
    // code to fire
}

// function invoked by the button element ----------------
function fireLink(event) {                   
    document.getElementById('myLink').click();      // script calls the "click" event of the link element 
}
person Pall Arpad    schedule 13.09.2018

Используйте вызов события jquery. Напишите строку ниже, в которой вы хотите активировать onChange любого элемента.

$("#element_id").change();

element_id - это идентификатор элемента, onChange которого вы хотите активировать.

Избегайте использования

 element.fireEvent("onchange");

Потому что у него очень меньше поддержки. Обратитесь к этому документу для получения поддержки.

person Bhuvan Arora    schedule 20.02.2018

Вам нужно что-то вроде этого:

document.getElementByClassName("example").click();

При использовании jQuery это будет примерно так:

$(".example").trigger("click");
person Osiris RD    schedule 30.03.2015
comment
Метод триггера не является неправильным, но это метод jquery - person Kamuran Sönecek; 29.12.2015
comment
1. document.getElementByClassName не существует. 2. document.getElementsByClassName существует, но возвращает список. 3. это работает только для нескольких избранных собственных событий. 4. В последнем примере запускается событие jQuery, если не существует базового собственного события. - person Glenn Jorde; 23.03.2016

person    schedule
comment
Это устарело. Полезно только для полифиллов. developer.mozilla.org/en-US/docs/Web/ API / MouseEvent / - person hipkiss; 12.01.2017