Слушатель событий DOM - не удается найти функцию прослушивателя [duplicate]

Отсутствует «extern» в объявлениях / определениях переменной const (только для C ++)

Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. когда отсутствует ключевое слово static).

Пример:

// file1.cpp
const int test = 5;    // in C++ same as "static const int test = 5"
int test2 = 5;

// file2.cpp
extern const int test;
extern int test2;

void foo()
{
 int x = test;   // linker error in C++ , no error in C
 int y = test2;  // no problem
}

correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp

extern const int test;
extern int test2;

. В качестве альтернативы можно было бы объявить переменную const в файле file1.cpp с явным extern

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

14 ответов

Вы можете использовать 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 26 August 2018 в 13:52
поделиться

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

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

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

6
ответ дан Aleksander Lech 26 August 2018 в 13:52
поделиться

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

// 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 26 August 2018 в 13:52
поделиться

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

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

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

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

8
ответ дан chopper 26 August 2018 в 13:52
поделиться

Я искал стреляющий клик, 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 26 August 2018 в 13:52
поделиться

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

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

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

10
ответ дан emisilva 26 August 2018 в 13:52
поделиться
36
ответ дан hev1 26 August 2018 в 13:52
поделиться

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

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

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

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

 element.fireEvent("onchange");

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

-1
ответ дан Bhuvan Arora 26 August 2018 в 13:52
поделиться
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 26 August 2018 в 13:52
поделиться

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

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

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

$(".example").trigger("click");
-10
ответ дан showdev 26 August 2018 в 13:52
поделиться
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 26 August 2018 в 13:52
поделиться

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

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

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

0
ответ дан Walle Cyril 26 August 2018 в 13:52
поделиться
Другие вопросы по тегам:

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