Возможно ли инициировать событие на addEventListener при вызове функции? [Дубликат]

Ошибка означает, что это неправильная версия JVM для этой версии Eclipse. Ссылка имеет более подробную информацию:

http://www.ehow.com/how_4784069_terminated-exit-code-error-eclipse.html

437
задан Ed Cottrell 16 December 2013 в 04:11
поделиться

16 ответов

Вы можете использовать fireEvent в IE 8 или ниже, а w3c - dispatchEvent в большинстве других браузеров. Чтобы создать событие, которое вы хотите запустить, вы можете использовать либо 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);
  } else {
    event = document.createEventObject();
    event.eventType = "dataavailable";
  }

  event.eventName = "dataavailable";

  if (document.createEvent) {
    element.dispatchEvent(event);
  } else {
    element.fireEvent("on" + event.eventType, event);
  }
408
ответ дан James Donnelly 16 August 2018 в 10:03
поделиться

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

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

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

6
ответ дан Aleksander Lech 16 August 2018 в 10:03
поделиться
  • 1
    Это не учитывает, что это за событие. Размытие и фокусировка могут вызвать событие, но это может быть не так. Это вызывает ошибки. – Mardok 25 January 2016 в 22:21
  • 2
    Это также относится к element.click(). – AxeEffect 13 June 2017 в 10:46
  • 3
    Это зафиксировало странную проблему для моего приложения Angular / Cordova, в Android, где текстовое поле отказалось бы очистить себя. Так что спасибо. – DarkNeuron 11 July 2017 в 12:22

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

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

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

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

 element.fireEvent("onchange");

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

-1
ответ дан Bhuvan Arora 16 August 2018 в 10:03
поделиться

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

// 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 docs .

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

269
ответ дан Bob Stein 16 August 2018 в 10:03
поделиться
  • 1
    Этот ответ более актуальен сейчас. Добавим: если должно быть знаковое событие (например, TransitionEvent , ClipboardEvent и т. Д.), Можно вызвать соответствующий конструктор. – Kiril 1 July 2014 в 14:04
  • 2
    Почему этот ответ не принят? – Angel Politis 8 July 2016 в 03:43
  • 3
    @AngelPolitis: поскольку он был написан после того, как предыдущий уже был принят, и человек, который написал вопрос (@KoolKabin), вероятно, не перечитал ответы – Dorian 16 July 2016 в 13:24
  • 4
    И потому, что его спросили в 2010 году – DarkNeuron 11 July 2017 в 12:17
  • 5
    Не будет работать с какой-либо версией IE ( caniuse.com/#feat=customevent ). См. Мой ответ для исправления. – Yarin 5 March 2018 в 20:02

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

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

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

Я нахожу это менее «интенсивно кодовым» и более легким для чтения .

8
ответ дан chopper 16 August 2018 в 10:03
поделиться
  • 1
    Что делать, если вы хотите сделать несколько разных вещей для одного и того же события (или хорошо, функция обратного вызова в вашем случае) в зависимости от контекста? :) Это хорошая альтернатива, но это больше похоже на комментарий, чем на ответ, поскольку OP хочет знать, как программно запускать событие, а не использовать обратный вызов :) – SidOfc 23 June 2017 в 13:26
  • 2
    Вы совершенно правы, что это должен был комментарий, а не ответ. Зачем? Потому что, э-э, ну, ... он не отвечает на вопрос, который действительно был задан. Хороший звонок. Что касается вашего собственного вопроса, я бы сказал, что это будет отличная возможность для конструкторов в JavaScript! ;-) Но без них, я бы сказал, отправьте аргумент с вызовом функции, и пусть это будет использоваться для определения того, что должна делать функция. – Kirby L. Wallace 11 September 2017 в 21:05

Я искал стреляющий клик, 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);
    }
};
12
ответ дан Community 16 August 2018 в 10:03
поделиться
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'

0
ответ дан Dan Alboteanu 16 August 2018 в 10:03
поделиться

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

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

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

9
ответ дан emisilva 16 August 2018 в 10:03
поделиться

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

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

и обрабатывать его с помощью

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

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

36
ответ дан hev1 16 August 2018 в 10:03
поделиться
  • 1
    Правильный синтаксис - $ ('# yourElement'). Trigger ('customEventName', [arg0, arg1, ..., argN]); Вы забыли [] по второму параметру – harry 9 July 2014 в 11:35
  • 2
    Отредактировано сейчас. Думаю, теперь ясно. – Hilder Vitor Lima Pereira 28 July 2014 в 19:36

Что-то вроде этого:

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

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

$(".example").trigger("click");
-10
ответ дан showdev 16 August 2018 в 10:03
поделиться
  • 1
    для всех тех, кто подал заявку: почему это неправильно? – user2808054 12 November 2015 в 17:29
  • 2
    метод триггера не является неправильным, но это метод jquery – Kamuran Sönecek 29 December 2015 в 09:33
  • 3
    1. document.getElementByClassName не существует. 2. document.getElementsByClassName существует, но возвращает список. 3. Это работает только для нескольких избранных событий. 4. В последнем примере запускается событие jQuery, где не существует основного основного события. – Glenn Jorde 23 March 2016 в 09:57
  • 4
    Какой вид сорняка вы используете? :-)) – AmerllicA 3 December 2017 в 13:45
function fireMouseEvent(obj, evtName) {
    if (obj.dispatchEvent) {
        //var event = new Event(evtName);
        var event = document.createEvent("MouseEvents");
        event.initMouseEvent(evtName, true, true, window,
                0, 0, 0, 0, 0, false, false, false, false, 0, null);
        obj.dispatchEvent(event);
    } else if (obj.fireEvent) {
        event = document.createEventObject();
        event.button = 1;
        obj.fireEvent("on" + evtName, event);
        obj.fireEvent(evtName);
    } else {
        obj[evtName]();
    }
}

var obj = document.getElementById("......");
fireMouseEvent(obj, "click");
4
ответ дан toto 16 August 2018 в 10:03
поделиться
  • 1
    Это устарело. Полезно только для полиполков. [Д0] developer.mozilla.org/en-US/docs/Web/API/MouseEvent/… – hipkiss 12 January 2017 в 17:59

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

Вы также можете инициировать поддельное событие с помощью CustomEvent и co.

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

0
ответ дан Walle Cyril 16 August 2018 в 10:03
поделиться
0
ответ дан Moorexa 29 October 2018 в 11:17
поделиться
-1
ответ дан Pall Arpad 29 October 2018 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: