kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Stano
Stano
Вопрос

Как проверить, существует ли динамически подключаемый слушатель событий или нет?

Вот моя проблема: можно ли как-то проверить существование динамически подключенного слушателя событий? Или как я могу проверить состояние свойства "onclick" (?) в DOM? Я искал решение в интернете, как и в Stack Overflow, но безуспешно. Вот мой html:

<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->

Затем в Javascript я прикрепляю динамически созданный слушатель событий ко второй ссылке:

document.getElementById('link2').addEventListener('click', linkclick, false);

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

// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?

jsFiddle здесь. Если нажать "Добавить onclick для 2", а затем "[ссылка 2]", событие срабатывает нормально, но "Тестовая ссылка 2" всегда сообщает false. Кто-нибудь может помочь?

66 2012-07-12T15:42:01+00:00 14
Brian  Tompsett - 汤莱恩
Brian Tompsett - 汤莱恩
Редактировал вопрос 25-го августа 2019 в 8:42
Программирование
javascript
testing
addeventlistener
dom-events
Решение / Ответ
 Ivan
Ivan
12-го июля 2012 в 3:58
2012-07-12T15:58:14+00:00
Дополнительно
Источник
Редактировать
#16673066

Не существует способа проверить, существуют ли динамически подключаемые слушатели событий или нет.

Единственный способ проверить, прикреплен ли слушатель событий, - это прикрепить слушателей событий следующим образом:

elem.onclick = function () { console.log (1) }

Затем вы можете проверить, был ли прикреплен слушатель событий к onclick, вернув !!elem.onclick (или что-то подобное).

36
0
Karol Grabowski
Karol Grabowski
16-го ноября 2017 в 12:56
2017-11-16T12:56:24+00:00
Дополнительно
Источник
Редактировать
#16673072

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

const element = document.getElementById('div');

if (element.getAttribute('listener') !== 'true') {
     element.addEventListener('click', function (e) {
         const elementClicked = e.target;
         elementClicked.setAttribute('listener', 'true');
         console.log('event has been attached');
    });
}

Создание специальных атрибутов для элемента, когда слушатель прикрепляется, а затем проверить, если он существует.

21
0
 Cesar
Cesar
16-го января 2013 в 6:10
2013-01-16T18:10:37+00:00
Дополнительно
Источник
Редактировать
#16673067

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

// initial load
var attached = false;

// this will only execute code once
doSomething = function() {
  if (!attached) {
    attached = true;
    //code
  }
} 

//attach your function with change event
window.onload = function() {
    var txtbox = document.getElementById("textboxID");
    if(window.addEventListener){
        txtbox.addEventListener("change", doSomething, false);
    } else if(window.attachEvent){
        txtbox.attachEvent("onchange", doSomething);
    }
}
 Cesar
Cesar
Редактировал ответ 11-го октября 2017 в 7:45
18
0
Angel Politis
Angel Politis
21-го ноября 2017 в 1:42
2017-11-21T13:42:48+00:00
Дополнительно
Источник
Редактировать
#16673073

сюжет: нет, вы не можете сделать это в любое поддерживаемых пути.


Единственный способ я знаю, чтобы достичь этого может быть создание пользовательского объекта хранения, где вы храните записи слушателей добавил. Что-то по следующим направлениям:

/* Create a storage object. */
var CustomEventStorage = [];

Шаг 1: Во-первых, вам нужна функция, которая может пройти объект хранения и возврата записи элемента данный элемент (или false).

/* The function that finds a record in the storage by a given element. */
function findRecordByElement (element) {
    /* Iterate over every entry in the storage object. */
    for (var index = 0, length = CustomEventStorage.length; index < length; index++) {
        /* Cache the record. */
        var record = CustomEventStorage[index];

        /* Check whether the given element exists. */
        if (element == record.element) {
            /* Return the record. */
            return record;
        }
    }

    /* Return false by default. */
    return false;
}

Шаг 2: тогда, вам понадобится функция, которая может добавить прослушиватель событий, но и вставить слушателя к объекту хранения.

/* The function that adds an event listener, while storing it in the storage object. */
function insertListener (element, event, listener, options) {
    /* Use the element given to retrieve the record. */
    var record = findRecordByElement(element);

    /* Check whether any record was found. */
    if (record) {
        /* Normalise the event of the listeners object, in case it doesn't exist. */
        record.listeners[event] = record.listeners[event] || [];
    }
    else {
        /* Create an object to insert into the storage object. */
        record = {
            element: element,
            listeners: {}
        };

        /* Create an array for event in the record. */
        record.listeners[event] = [];

        /* Insert the record in the storage. */
        CustomEventStorage.push(record);
    }

    /* Insert the listener to the event array. */
    record.listeners[event].push(listener);

    /* Add the event listener to the element. */
    element.addEventListener(event, listener, options);
}

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

/* The function that checks whether an event listener is set for a given event. */
function listenerExists (element, event, listener) {
    /* Use the element given to retrieve the record. */
    var record = findRecordByElement(element);

    /* Check whether a record was found & if an event array exists for the given event. */
    if (record && event in record.listeners) {
        /* Return whether the given listener exists. */
        return !!~record.listeners[event].indexOf(listener);
    }

    /* Return false by default. */
    return false;
}

Шаг 4: Наконец, вам понадобится функция, которая может удалить слушателя из объекта хранения.

/* The function that removes a listener from a given element & its storage record. */
function removeListener (element, event, listener, options) {
    /* Use the element given to retrieve the record. */
    var record = findRecordByElement(element);

    /* Check whether any record was found and, if found, whether the event exists. */
    if (record && event in record.listeners) {
        /* Cache the index of the listener inside the event array. */
        var index = record.listeners[event].indexOf(listener);

        /* Check whether listener is not -1. */
        if (~index) {
            /* Delete the listener from the event array. */
            record.listeners[event].splice(index, 1);
        }

        /* Check whether the event array is empty or not. */
        if (!record.listeners[event].length) {
            /* Delete the event array. */
            delete record.listeners[event];
        }
    }

    /* Add the event listener to the element. */
    element.removeEventListener(event, listener, options);
}

Отрывок:

в

window.onload = function () {
  var
    /* Cache the test element. */
    element = document.getElementById("test"),

    /* Create an event listener. */
    listener = function (e) {
      console.log(e.type + "triggered!");
    };

  /* Insert the listener to the element. */
  insertListener(element, "mouseover", listener);

  /* Log whether the listener exists. */
  console.log(listenerExists(element, "mouseover", listener));

  /* Remove the listener from the element. */
  removeListener(element, "mouseover", listener);

  /* Log whether the listener exists. */
  console.log(listenerExists(element, "mouseover", listener));
};
<!-- Include the Custom Event Storage file -->
<script src = "https://cdn.rawgit.com/angelpolitis/custom-event-storage/master/main.js"></script>

<!-- A Test HTML element -->
<div id = "test" style = "background:#000; height:50px; width: 50px"></div>

в


Although более 5 лет прошло с момента ОП запостил вопрос, я считаю, что люди, которые наткнуться на это в будущем принесет большую пользу от этого ответа, так что не стесняйтесь, чтобы сделать предложения или улучшений к нему. 😊

6
0
Paul Leclerc
Paul Leclerc
12-го мая 2016 в 3:12
2016-05-12T15:12:25+00:00
Дополнительно
Источник
Редактировать
#16673071

Вы всегда можете проверить вручную, если существуют для EventListener, используя например инспектор кром. В разделе элемент у вас есть традиционные и"стили" на вкладке и близко к нему еще один : "у слушателей событий". Что даст вам список всех самое eventlisteners с их взаимосвязанных элементов.

5
0
 arufian
arufian
4-го июля 2018 в 6:52
2018-07-04T06:52:26+00:00
Дополнительно
Источник
Редактировать
#16673075

Возможные дубликаты: https://stackoverflow.com/questions/28056716/check-if-an-element-has-event-listener-on-it-no-jquery/41137585. Пожалуйста, найдите мой ответ.

В основном здесь находится фишка для Хрома (хром) браузер:

getEventListeners(document.querySelector('your-element-selector'));
4
0
 dsmith63
dsmith63
16-го мая 2014 в 4:10
2014-05-16T16:10:03+00:00
Дополнительно
Источник
Редактировать
#16673068

Вот сценарий, который я использовал для проверки существования динамически подключаемого слушателя событий. Я использовал jQuery, чтобы прикрепить обработчик события к элементу, а затем вызвать это событие (в данном случае 'клик'). Таким образом, я могу получить и захватить свойства события, которые будут существовать только при наличии обработчика события.

var eventHandlerType;

$('#contentDiv').on('click', clickEventHandler).triggerHandler('click');

function clickEventHandler(e) {
    eventHandlerType = e.type;
}

if (eventHandlerType === 'click') {
    console.log('EventHandler "click" has been applied');
}
3
0
1.21 gigawatts
1.21 gigawatts
28-го октября 2019 в 10:20
2019-10-28T22:20:10+00:00
Дополнительно
Источник
Редактировать
#16673079

Кажется странным, что этот метод не'т существуют. Не пора ли добавить его, наконец?

Если вы хотели вы могли бы что-то вроде следующего (непроверенных):

var _addEventListener = EventTarget.prototype.addEventListener;
var _removeEventListener = EventTarget.prototype.removeEventListener;
EventTarget.prototype.events = {};
EventTarget.prototype.addEventListener = function(name, function, etc) {
   var events = EventTarget.prototype.events;
   if (events[name]==null) {
      events[name] = [];
   }

   if (events[name].indexOf(function)==-1) {
      events[name].push(function);
   }

   _addEventListener(name, function);
}
EventTarget.prototype.removeEventListener = function(name) {
   var events = EventTarget.prototype.events;

   if (events[name]!=null && events[name].indexOf(function)!=-1) {
      events[name].splice(events[name].indexOf(function), 1);
   }

   _removeEventListener(name, function);
}
EventTarget.prototype.hasEventListener = function(name) {
   var events = EventTarget.prototype.events;
   if (events[name]==null) {
      return false;
   }

   return events[name].length);
}
0
0
 Entretoize
Entretoize
15-го октября 2019 в 9:06
2019-10-15T09:06:25+00:00
Дополнительно
Источник
Редактировать
#16673078

Просто удалить событие, прежде чем добавить :

document.getElementById('link2').removeEventListener('click', linkclick, false);
document.getElementById('link2').addEventListener('click', linkclick, false);
0
0
Gaurang Tandon
Gaurang Tandon
10-го июня 2015 в 10:33
2015-06-10T10:33:53+00:00
Дополнительно
Источник
Редактировать
#16673070

Я просто написал скрипт, который позволит вам достигнуть этого. Это дает вам две глобальные функции: hasEvent(узла эум, строка события) " и " getEvents(узла эум), которые вы можете использовать. Следует помнить, что он изменяетeventtarget из методапрототипдобавить/метода removeeventlistener, а не работает для событий добавлено через разметку HTML или JavaScript синтаксис из вяза.on_event = ...`

Больше информации на GitHub

Демо

Автор сценария:

var hasEvent,getEvents;!function(){function b(a,b,c){c?a.dataset.events+=","+b:a.dataset.events=a.dataset.events.replace(new RegExp(b),"")}function c(a,c){var d=EventTarget.prototype[a+"EventListener"];return function(a,e,f,g,h){this.dataset.events||(this.dataset.events="");var i=hasEvent(this,a);return c&&i||!c&&!i?(h&&h(),!1):(d.call(this,a,e,f),b(this,a,c),g&&g(),!0)}}hasEvent=function(a,b){var c=a.dataset.events;return c?new RegExp(b).test(c):!1},getEvents=function(a){return a.dataset.events.replace(/(^,+)|(,+$)/g,"").split(",").filter(function(a){return""!==a})},EventTarget.prototype.addEventListener=c("add",!0),EventTarget.prototype.removeEventListener=c("remove",!1)}();
Gaurang Tandon
Gaurang Tandon
Редактировал ответ 10-го июня 2015 в 10:40
0
0
Dave F
Dave F
29-го сентября 2018 в 5:40
2018-09-29T17:40:46+00:00
Дополнительно
Источник
Редактировать
#16673076

Там ничего'т, кажется, чтобы быть кросс-браузер, который ищет событий, зарегистрированных в указанный элемент.

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

Для Firefox

Во-первых, вид элемента в Инспектор вкладка в "инструменты разработчика". Это может быть сделано:

  • На странице щелкните правой кнопкой мыши на элемент на веб-странице, который вы хотите проверить и выберите "и проверить элемент" из меню.
  • Консоли с помощью функции выбора элементов, таких как документ.querySelector, а затем щелкните значок рядом с элементом, чтобы посмотреть его в Инспектор вкладка.

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

Хром

Во-первых, вид элемента элементы вкладку в инструменты разработчика. Это может быть сделано:

  • На странице щелкните правой кнопкой мыши на элемент на веб-странице, который вы хотите проверить и выберите и"Проверить" из меню
  • Консоли с помощью функции выбора элементов, таких как документ.querySelector, щелкните правой кнопкой мыши на элементе и выбрав "и раскрыть в панели элементов", чтобы посмотреть его в Инспектор вкладка.

Рядом в разделе окна, которое показывает дерево, содержащее элементы веб-страницы, там должен быть еще один раздел со вкладки под названием "и прослушивателей событий на". Выберите его, чтобы увидеть события, которые были зарегистрированы на элемент. Чтобы увидеть код для данного события, щелкните ссылку справа от него.

В Chrome, событий для элемента можно также найти с помощью getEventListeners функция. Однако, исходя из моих тестов, getEventListeners функция не'т список событий, когда несколько элементов передаются ей. Если вы хотите, чтобы найти все элементы на странице, которые слушатели и вид функции обратного вызова для этих слушателей, вы можете использовать следующий код в консоли для этого:

var elems = document.querySelectorAll('*');

for (var i=0; i <= elems.length; i++) {
    var listeners = getEventListeners(elems[i]);

    if (Object.keys(listeners).length < 1) {
        continue;
    }

    console.log(elems[i]);

    for (var j in listeners) {
        console.log('Event: '+j);

        for (var k=0; k < listeners[j].length; k++) {
            console.log(listeners[j][k].listener);
        }
    }
}

Пожалуйста, редактировать этот ответ, если вы знаете, способов сделать это в данный браузерах или в других браузерах.

Dave F
Dave F
Редактировал ответ 29-го сентября 2018 в 6:04
0
0
 Webwoman
Webwoman
29-го мая 2019 в 9:00
2019-05-29T21:00:14+00:00
Дополнительно
Источник
Редактировать
#16673077

Если я правильно понял, вы можете только проверить если слушатель был проверен, но не слушатель ведущий специально.

Таким образом, некоторые специальный код позволит восполнить пробел, чтобы обработать ваш поток кодирования. Практическим методом было бы создавать "государство", используя переменные. Например, прикрепить слушатель'ы шашку следующим образом:

var listenerPresent=false

затем, если вы установите слушатель просто изменить значение:

listenerPresent=true

затем внутри вашего для EventListener 'с обратного вызова можно назначить определенные функции внутри и таким же образом, распределить доступ к функциям в зависимости от какого-либо государства в качестве переменной, например:

accessFirstFunctionality=false
accessSecondFunctionality=true
accessThirdFunctionality=true
0
0
 kofifus
kofifus
10-го мая 2018 в 3:06
2018-05-10T03:06:44+00:00
Дополнительно
Источник
Редактировать
#16673074

Вы могли бы в теории контрейлерных addEventListener и removeeventlistener, чтобы добавить удалить флаг 'Это' объект. Некрасиво и я не'т испытан ...

-1
0
 carinlynchin
carinlynchin
29-го апреля 2015 в 4:13
2015-04-29T16:13:31+00:00
Дополнительно
Источник
Редактировать
#16673069

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

если вы делаете :

item.onclick

он вернется на "нуль"и

но если вы делаете:

item.hasOwnProperty('onclick')

тогда это есть "Правда"и

поэтому я думаю, что когда вы используете "от метода addEventListener", чтобы добавить обработчики событий, единственный способ получить доступ к это через я;метод hasOwnProperty &quot и;. Хотел бы я знать, почему или как, но увы, после исследования, я не'т нашли объяснение.

-1
0
Похожие сообщества 12
JavaScript Jobs — чат
JavaScript Jobs — чат
26 291 пользователей
JavaScript Jobs — чат для поиска работы и людей Правила оформления: @telegram-ru/r1WQe5F1m" rel="nofollow noopener noreferrer" class="text-blue hover:text-black link" target="_blank">https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru
Открыть telegram
JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
9 470 пользователей
Помогаем друг другу разбираться с JS Правила: @js_noobs_ru/rules" rel="nofollow noopener noreferrer" class="text-blue hover:text-black link" target="_blank">https://teletype.in/@js_noobs_ru/rules Другие полезные чаты — https://github.com/goq/telegram-list или https://rudevs.network/ByKT2JwWQ
Открыть telegram
JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
7 714 пользователей
Рекомендуем сразу отключить уведомления Правила: https://git.io/JycBd См. также: @js_noobs_ru, @nodejs_ru, @ts_cool, @react_js, @electron_cool Вакансии и поиск работы: @javascript_jobs
Открыть telegram
JavaScript.Ninja
JavaScript.Ninja
3 810 пользователей
Правила поведения проекта https://telegra.ph/Kodeks-povedeniya-proekta-JavaScriptNinja-12-15
Открыть telegram
pro.js
pro.js
3 721 пользователей
Сообщество веб (и javascript) разработчиков Чат для начинающих: @js_lib ⚠️ Вакансии - раз в неделю с вилкой зп ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌Варез По всем вопросам: @igorz Зам: @slavik4
Открыть telegram
javascript_ru
javascript_ru
2 726 пользователей
Сообщество любителей самого популярного языка программирования в мире. Публикация вакансий: @javascript_jobs Чаты: @frontend_ru @css_ru Каналы: @defront @frontendnoteschannel Флуд: @javascript_ru_flood Важно! http://nometa.xyz и http://neprivet.ru
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ES
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией