как найти количество событий, связанных с html control [duplicate]

Другим случаем, когда NullReferenceExceptions может случиться, является (неправильное) использование оператора as :

class Book {
    public string Name { get; set; }
}
class Car { }

Car mycar = new Car();
Book mybook = mycar as Book;   // Incompatible conversion --> mybook = null

Console.WriteLine(mybook.Name);   // NullReferenceException

Здесь Book и Car являются несовместимыми типами; a Car не может быть преобразован / передан в Book. Когда этот сбой завершается неудачно, as возвращает null. Используя mybook после этого, вы вызываете NullReferenceException.

В общем случае вы должны использовать cast или as, как показано ниже:

Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:

ComicBook cb = (ComicBook)specificBook;

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

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}

327
задан Crescent Fresh 5 January 2010 в 21:38
поделиться

9 ответов

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

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

Результат из $._data будет объектом, который содержит оба события, которые мы установили (на фото ниже с свойство mouseout расширилось):

Console output for $._ [/g1]

Затем в Chrome вы можете щелкнуть правой кнопкой мыши функцию обработчика и нажать «Просмотр функции определения», чтобы показать вам точное место, где оно определено в вашем коде.

472
ответ дан MrLore 26 August 2018 в 11:33
поделиться
  • 1
    Это работает только для элементов, связанных с помощью помощников jQuery. – Alex Ciminian 18 February 2012 в 20:02
  • 2
    @jammypeach Я пытаюсь ваше решение, но все еще получаю undefined, возвращенный для селектора. Я использовал $ ('# elem'). Bind ('click', function () {}); если бы это имело бы значение. – Marcus 19 October 2012 в 03:13
  • 3
    @marcus ahhh, woops Я пропустил что-то, извините :) $._data(element[0], ‘events’); – totallyNotLizards 23 October 2012 в 09:10
  • 4
    В эти дни нужно использовать: $ ._ data ($ ('# foo') [0]) .events – Donald Taylor 14 April 2015 в 20:44
  • 5
    $._data() используется внутренним JQuery. $.data() является общедоступным методом для пользователя. И $.data(element, 'events') работает отлично. – novaline 11 May 2017 в 03:54

Общий случай:

  • Хит F12 для открытия Dev Tools
  • Щелкают по вкладке Sources
  • С правой стороны прокрутите вниз на Event Listener Breakpoints и развернуть дерево
  • Нажмите на события, которые вы хотите прослушать.
  • Взаимодействие с целевым элементом, если они срабатывают, вы получите точку останова в отладчике

Аналогичным образом вы можете:

  • щелкнуть правой кнопкой мыши по целевому элементу -> выбрать «Inspect element»
  • Прокрутите вниз правую сторону dev-ранга, внизу «event listeners».
  • Разверните дерево, чтобы увидеть, какие события привязаны к элементу. Не уверен, что это работает для событий, которые обрабатываются посредством барботажа (я предполагаю, что нет)
62
ответ дан acdcjunior 26 August 2018 в 11:33
поделиться
  • 1
    Я согласен, что это предпочтительный метод и является универсальным решением по сравнению с использованием jQuery, который может быть или не быть доступен. – deadbabykitten 23 April 2015 в 17:48
  • 2
    @dead umm ... вопрос конкретно относится к jQuery и использует jQuery в вложении примера - ответ должен быть действителен только в контексте jQuery (?) – Code Jockey 28 March 2016 в 18:06
  • 3
    Полезно также понимать ответы в других контекстах. Просто потому, что кто-то задает конкретный вопрос, это не означает, что ограниченный ответ, который они будут получать, является лучшим из доступных. Особенно с jQuery, люди склонны полагаться на него как на костыль. Важно понимать базовую архитектуру. Этот ответ показывает, что jQuery даже не требуется. Вопрос и пример слишком расплывчаты, чтобы знать об использовании и, следовательно, оставляют открытым для интерпретации то, что можно считать действительным ответом. – deadbabykitten 28 March 2016 в 23:07

Я использовал что-то вроде этого, если ($ ._ data ($ ("a.wine-item-link") [0]). events == null) {... что-то сделать, в значительной степени привязать обработчики событий снова }, чтобы проверить, привязан ли мой элемент к какому-либо событию. Он все равно скажет undefined (null), если вы отключили все обработчики событий от этого элемента. Вот почему я оцениваю это в выражении if.

2
ответ дан Adrian Liew 26 August 2018 в 11:33
поделиться

Хотя это не совсем точно для селекторов / объектов jQuery, в FireFox Quantum 58.x вы можете найти обработчики событий для элемента с помощью инструментов Dev:

  1. Щелкните правой кнопкой мыши Элемент
  2. В контекстном меню нажмите «Осмотреть элемент»
  3. Если рядом с элементом есть значок «ev», щелкните значок «ev» [/] g3]
  4. Отображает все события для этого элемента и обработчика событий

2
ответ дан Chris22 26 August 2018 в 11:33
поделиться
  • 1
    Удивительный ответ, особенно скриншот, делает его намного проще. Благодарю вас за усилия! – bizi 1 March 2018 в 22:52

Когда я передаю небольшой комплексный запрос DOM к данным $ ._ следующим образом: $._data($('#outerWrap .innerWrap ul li:last a'), 'events') он бросает неопределенные в консоли браузера.

Поэтому мне пришлось использовать данные $ ._ в родительском div: $._data($('#outerWrap')[0], 'events'), чтобы увидеть события для тегов. Вот JSFiddle для этого же: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/

0
ответ дан giri-jeedigunta 26 August 2018 в 11:33
поделиться
  • 1
    Причина этого в том, что вы делегируете событие из $('#outerWrap'). События фактически связаны с этим элементом, а не с отдельными якорями. – Scottux 14 May 2014 в 16:06

Плагин плагина jQuery Audit плагин должен позволить вам сделать это через обычные инструменты Chrome Dev. Это не идеально, но это должно позволить вам увидеть фактического обработчика, связанного с элементом / событием, а не только с общим обработчиком jQuery.

6
ответ дан JohnK 26 August 2018 в 11:33
поделиться

Я добавляю это для потомков; Есть более простой способ, который не требует написания более JS. С помощью удивительного дополнения firebug для firefox ,

  1. Щелкните правой кнопкой мыши на элементе и выберите «Осмотреть элемент с помощью Firebug»
  2. На панелях боковой панели ( как показано на скриншоте), перейдите на вкладку событий с помощью крошечной стрелки
  3. . На вкладке «События» отображаются события и соответствующие функции для каждого события
  4. . Рядом с ним отображается функция местоположение

11
ответ дан kakoma 26 August 2018 в 11:33
поделиться

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

$._data( $(document)[0], "events" );

И найдите событие с правильным селектором:

Затем посмотрите на обработчик> [[FunctionLocation]]

0
ответ дан Pikamander2 26 August 2018 в 11:33
поделиться

Теперь вы можете просто получить список прослушивателей событий, привязанных к объекту, с помощью функции javascript getEventListeners ().

Например, введите в консоль инструментов dev следующее:

// Get all event listners bound to the document object
getEventListeners(document);
2
ответ дан ScottyG 26 August 2018 в 11:33
поделиться
Другие вопросы по тегам:

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