Как вы регистрируете все события, запущенные элементом jQuery?

Я хочу видеть все события, инициированные полем , когда пользователь взаимодействует с ним. Это включает в себя такие вещи, как:

  • Нажав на нее.
  • Отключить его.
  • Вкладка в нее.
  • Отвлекаясь от него.
  • Ctrl + C и Ctrl + V на клавиатуре.
  • Щелкните правой кнопкой мыши → Вставить.
  • Щелкните правой кнопкой мыши → Вырезать.
  • Щелкните правой кнопкой мыши → Копировать.
  • Перетаскивание текста из другого приложения.
  • Изменение его с помощью Javascript.
  • Изменение его с помощью средства отладки, например Firebug.

Я хотел бы отобразить его с помощью console.log. Возможно ли это в Javascript/jQuery, и если да, то как это сделать?

Ответ 1

$(element).on("click mousedown mouseup focus blur keydown change",function(e){
     console.log(e);
});

Это даст вам много (но не все) информации о том, если уволено событие... кроме ручного кодирования такого типа, я не могу придумать другого способа сделать это.

Ответ 2

Я понятия не имею, почему никто не использует это... (может быть, потому, что это только вещь веб-сайта)

Открыть консоль:

monitorEvents(document.body); // logs all events on the body

monitorEvents(document.body, 'mouse'); // logs mouse events on the body

monitorEvents(document.body.querySelectorAll('input')); // logs all events on inputs

Ответ 3

Существует хороший общий способ использования коллекции .data('events'):

function getEventsList($obj) {
    var ev = new Array(),
        events = $obj.data('events'),
        i;
    for(i in events) { ev.push(i); }
    return ev.join(' ');
}

$obj.on(getEventsList($obj), function(e) {
    console.log(e);
});

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

Кстати: если вы хотите, чтобы каждое возможное событие запускалось на объекте, используйте firebug: просто щелкните правой кнопкой мыши на элементе DOM на вкладке html и выберите "Журнал событий". Каждое событие затем записывается в консоль (это иногда немного раздражает, потому что оно регистрирует каждое движение мыши...).

Ответ 4

$('body').on("click mousedown mouseup focus blur keydown change mouseup click dblclick mousemove mouseover mouseout mousewheel keydown keyup keypress textInput touchstart touchmove touchend touchcancel resize scroll zoom focus blur select change submit reset",function(e){
     console.log(e);
}); 

Ответ 5

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

let input = document.getElementById('inputId');

Object.getOwnPropertyNames(input)
  .filter(key => key.slice(0, 2) === 'on')
  .map(key => key.slice(2))
  .forEach(eventName => {
    input.addEventListener(eventName, event => {
      console.log(event.type);
      console.log(event);
    });
  });

Надеюсь, это поможет любому, кто это читает.

EDIT

Итак, я увидел еще один вопрос здесь, который был похожим, поэтому другим предложением было бы сделать следующее:

monitorEvents(document.getElementById('inputId'));

Ответ 6

Старый поток, я знаю. Мне также нужно было что-то для мониторинга событий, и я написал это очень удобное (отличное) решение. Вы можете отслеживать все события с помощью этого хука (в Windows-программировании это называется хуком). Этот хук не влияет на работу вашего программного обеспечения/программы.

В журнале консоли вы можете увидеть что-то вроде этого:

console log

Объяснение того, что вы видите:

В журнале консоли вы увидите все выбранные вами события (см. ниже "как использовать") и отобразите тип объекта, имя (имена) класса, идентификатор, & lt;: имя функции>, & lt;: имя события>. Форматирование объектов похоже на CSS.

Когда вы нажимаете кнопку или какое-либо связанное событие, вы видите его в журнале консоли.

Код, который я написал:

function setJQueryEventHandlersDebugHooks(bMonTrigger, bMonOn, bMonOff)
{
   jQuery.fn.___getHookName___ = function()    
       {
          // First, get object name
         var sName = new String( this[0].constructor ),
         i = sName.indexOf(' ');
         sName = sName.substr( i, sName.indexOf('(')-i );    

         // Classname can be more than one, add class points to all
         if( typeof this[0].className === 'string' )
         {
           var sClasses = this[0].className.split(' ');
           sClasses[0]='.'+sClasses[0];
           sClasses = sClasses.join('.');
           sName+=sClasses;
         }
         // Get id if there is one
         sName+=(this[0].id)?('#'+this[0].id):'';
         return sName;
       };

   var bTrigger        = (typeof bMonTrigger !== "undefined")?bMonTrigger:true,
       bOn             = (typeof bMonOn !== "undefined")?bMonOn:true,
       bOff            = (typeof bMonOff !== "undefined")?bMonOff:true,
       fTriggerInherited = jQuery.fn.trigger,
       fOnInherited    = jQuery.fn.on,
       fOffInherited   = jQuery.fn.off;

   if( bTrigger )
   {
    jQuery.fn.trigger = function()
    {
     console.log( this.___getHookName___()+':trigger('+arguments[0]+')' );
     return fTriggerInherited.apply(this,arguments);
    };
   }

   if( bOn )
   {
    jQuery.fn.on = function()
    {
     if( !this[0].__hooked__ ) 
     {
       this[0].__hooked__ = true; // avoids infinite loop!
       console.log( this.___getHookName___()+':on('+arguments[0]+') - binded' );
       $(this).on( arguments[0], function(e)
       {
         console.log( $(this).___getHookName___()+':'+e.type );
       });
     }
     var uResult = fOnInherited.apply(this,arguments);
     this[0].__hooked__ = false; // reset for another event
     return uResult;
    };
   }

   if( bOff )
   {
    jQuery.fn.off = function()
    {
     if( !this[0].__unhooked__ ) 
     {
       this[0].__unhooked__ = true; // avoids infinite loop!
       console.log( this.___getHookName___()+':off('+arguments[0]+') - unbinded' );
       $(this).off( arguments[0] );
     }

     var uResult = fOffInherited.apply(this,arguments);
     this[0].__unhooked__ = false; // reset for another event
     return uResult;
    };
   }
}

Примеры, как его использовать:

Следить за всеми событиями:

setJQueryEventHandlersDebugHooks();

Отслеживайте только все триггеры:

setJQueryEventHandlersDebugHooks(true,false,false);

Мониторинг только ВКЛ событий:

setJQueryEventHandlersDebugHooks(false,true,false);

Мониторинг всех отключен только для привязки:

setJQueryEventHandlersDebugHooks(false,false,true);

Замечания/Примечание:

  • Используйте это только для отладки, отключите его при использовании в финальной версии продукта версия
  • Если вы хотите увидеть все события, вы должны вызвать эту функцию непосредственно после загрузки jQuery
  • Если вы хотите видеть только меньше событий, вы можете вызвать функцию в нужное время
  • Если вы хотите выполнить его автоматически, place()(); вокруг функции

Надеюсь, это поможет! ;-)

Ответ 7

https://github.com/robertleeplummerjr/wiretap.js

new Wiretap({
  add: function() {
      //fire when an event is bound to element
  },
  before: function() {
      //fire just before an event executes, arguments are automatic
  },
  after: function() {
      //fire just after an event executes, arguments are automatic
  }
});

Ответ 8

Просто добавьте это на страницу и никаких других забот, вы будете отдыхать для вас:

$('input').live('click mousedown mouseup focus keydown change blur', function(e) {
     console.log(e);
});

Вы также можете использовать console.log('Input event:' + e.type), чтобы упростить его.

Ответ 9

ШАГ 1: Проверьте events на наличие HTML element на developer console:

enter image description here

ШАГ 2: Послушайте events, который мы хотим запечатлеть:

$(document).on('ch-ui-container-closed ch-ui-container-opened', function(evt){
 console.log(evt);
});

Удачи...

Ответ 10

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

// specify any elements you've attached listeners to here
const nodes = [document]

// https://developer.mozilla.org/en-US/docs/Web/Events
const logBrowserEvents = () => {
  const AllEvents = {
    AnimationEvent: ['animationend', 'animationiteration', 'animationstart'],
    AudioProcessingEvent: ['audioprocess'],
    BeforeUnloadEvent: ['beforeunload'],
    CompositionEvent: [
      'compositionend',
      'compositionstart',
      'compositionupdate',
    ],
    ClipboardEvent: ['copy', 'cut', 'paste'],
    DeviceLightEvent: ['devicelight'],
    DeviceMotionEvent: ['devicemotion'],
    DeviceOrientationEvent: ['deviceorientation'],
    DeviceProximityEvent: ['deviceproximity'],
    DragEvent: [
      'drag',
      'dragend',
      'dragenter',
      'dragleave',
      'dragover',
      'dragstart',
      'drop',
    ],
    Event: [
      'DOMContentLoaded',
      'abort',
      'afterprint',
      'beforeprint',
      'cached',
      'canplay',
      'canplaythrough',
      'change',
      'chargingchange',
      'chargingtimechange',
      'checking',
      'close',
      'dischargingtimechange',
      'downloading',
      'durationchange',
      'emptied',
      'ended',
      'error',
      'fullscreenchange',
      'fullscreenerror',
      'input',
      'invalid',
      'languagechange',
      'levelchange',
      'loadeddata',
      'loadedmetadata',
      'noupdate',
      'obsolete',
      'offline',
      'online',
      'open',
      'open',
      'orientationchange',
      'pause',
      'play',
      'playing',
      'pointerlockchange',
      'pointerlockerror',
      'ratechange',
      'readystatechange',
      'reset',
      'seeked',
      'seeking',
      'stalled',
      'submit',
      'success',
      'suspend',
      'timeupdate',
      'updateready',
      'visibilitychange',
      'volumechange',
      'waiting',
    ],
    FocusEvent: [
      'DOMFocusIn',
      'DOMFocusOut',
      'Unimplemented',
      'blur',
      'focus',
      'focusin',
      'focusout',
    ],
    GamepadEvent: ['gamepadconnected', 'gamepaddisconnected'],
    HashChangeEvent: ['hashchange'],
    KeyboardEvent: ['keydown', 'keypress', 'keyup'],
    MessageEvent: ['message'],
    MouseEvent: [
      'click',
      'contextmenu',
      'dblclick',
      'mousedown',
      'mouseenter',
      'mouseleave',
      'mousemove',
      'mouseout',
      'mouseover',
      'mouseup',
      'show',
    ],
    // https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events
    MutationNameEvent: ['DOMAttributeNameChanged', 'DOMElementNameChanged'],
    MutationEvent: [
      'DOMAttrModified',
      'DOMCharacterDataModified',
      'DOMNodeInserted',
      'DOMNodeInsertedIntoDocument',
      'DOMNodeRemoved',
      'DOMNodeRemovedFromDocument',
      'DOMSubtreeModified',
    ],
    OfflineAudioCompletionEvent: ['complete'],
    OtherEvent: ['blocked', 'complete', 'upgradeneeded', 'versionchange'],
    UIEvent: [
      'DOMActivate',
      'abort',
      'error',
      'load',
      'resize',
      'scroll',
      'select',
      'unload',
    ],
    PageTransitionEvent: ['pagehide', 'pageshow'],
    PopStateEvent: ['popstate'],
    ProgressEvent: [
      'abort',
      'error',
      'load',
      'loadend',
      'loadstart',
      'progress',
    ],
    SensorEvent: ['compassneedscalibration', 'Unimplemented', 'userproximity'],
    StorageEvent: ['storage'],
    SVGEvent: [
      'SVGAbort',
      'SVGError',
      'SVGLoad',
      'SVGResize',
      'SVGScroll',
      'SVGUnload',
    ],
    SVGZoomEvent: ['SVGZoom'],
    TimeEvent: ['beginEvent', 'endEvent', 'repeatEvent'],
    TouchEvent: [
      'touchcancel',
      'touchend',
      'touchenter',
      'touchleave',
      'touchmove',
      'touchstart',
    ],
    TransitionEvent: ['transitionend'],
    WheelEvent: ['wheel'],
  }

  const RecentlyLoggedDOMEventTypes = {}

  Object.keys(AllEvents).forEach((DOMEvent) => {
    const DOMEventTypes = AllEvents[DOMEvent]

    if (Object.prototype.hasOwnProperty.call(AllEvents, DOMEvent)) {
      DOMEventTypes.forEach((DOMEventType) => {
        const DOMEventCategory = '${DOMEvent} ${DOMEventType}'

        nodes.forEach((node) => {
          node.addEventListener(
            DOMEventType,
            (e) => {
              if (RecentlyLoggedDOMEventTypes[DOMEventCategory]) return

              RecentlyLoggedDOMEventTypes[DOMEventCategory] = true

              // NOTE: throttle continuous events
              setTimeout(() => {
                RecentlyLoggedDOMEventTypes[DOMEventCategory] = false
              }, 1000)

              const isActive = e.target === document.activeElement

              // https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
              const hasActiveElement = document.activeElement !== document.body

              const msg = [
                DOMEventCategory,
                'target:',
                e.target,
                ...(hasActiveElement
                  ? ['active:', document.activeElement]
                  : []),
              ]

              if (isActive) {
                console.info(...msg)
              }
            },
            true,
          )
        })
      })
    }
  })
}
logBrowserEvents()
// export default logBrowserEvents

Ответ 11

$(document).on("click mousedown mouseup focus blur keydown change",function(e){
    console.log(e);
});