Как я могу связать все события в элементе DOM? - PullRequest
61 голосов
/ 01 мая 2011

Как я могу связать все события (например, click, keypress, mousedown) в элементе DOM, используя jQuery, не перечисляя каждое из них по отдельности?

Пример:

$('#some-el').bind('all events', function(e) {
    console.log(e.type);
});

Ответы [ 7 ]

52 голосов
/ 01 мая 2011

существует простой (но не точный) способ проверки всех событий:

function getAllEvents(element) {
    var result = [];
    for (var key in element) {
        if (key.indexOf('on') === 0) {
            result.push(key.slice(2));
        }
    }
    return result.join(' ');
}

затем свяжите все события следующим образом:

var el = $('#some-el');
el.bind(getAllEvents(el[0]), function(e) {
    /* insert your code */
});
49 голосов
/ 01 мая 2013

Вы также можете переопределить jQuery.event.trigger, чтобы перехватывать каждое событие, но, я думаю, этот способ хорош только для изучения внешнего API, а не для производства:

var oldJQueryEventTrigger = jQuery.event.trigger;
jQuery.event.trigger = function( event, data, elem, onlyHandlers ) { 
  console.log( event, data, elem, onlyHandlers ); 
  oldJQueryEventTrigger( event, data, elem, onlyHandlers ); 
}
9 голосов
/ 21 февраля 2013

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

var events = $._data($('yourelement')[0], "events");

Это дает вложенный список всех связанных событий, сгруппированных по "base""event (без пространства имен).

Однако я только что понял, что вам нужны все нативные события jQuery - вы можете просмотреть $.event, некоторые из которых находятся под $.event.special, но ответ принят все еще может быть вашим лучшим выбором.Вы также можете посмотреть, что jQuery перечисляет как возможные функции связывания .

8 голосов
/ 29 мая 2016

Вот небольшое расширение для jQuery:

$.fn.onAny = function(cb){
  for(var k in this[0])
    if(k.search('on') === 0)
      this.on(k.slice(2), function(e){
        // Probably there's a better way to call a callback function with right context, $.proxy() ?
        cb.apply(this,[e]);
      });
  return this;
};    

Использование:

$('#foo').onAny(function(e){
  console.log(e.type);
});  

Также вы можете просто использовать консоль браузера (из этот ответ ):

monitorEvents($0, 'mouse'); // log all events of an inspected element
monitorEvents(document.body); // log all events on the body
monitorEvents(document.body, 'mouse'); // log mouse events on the body
monitorEvents(document.body.querySelectorAll('input')); // log all events on inputs
8 голосов
/ 01 мая 2011

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

$("#test").bind("blur focus focusin focusout load resize scroll unload click " +
    "dblclick mousedown mouseup mousemove mouseover mouseout mouseenter " + 
     "mouseleave change select submit keydown keypress keyup error", function(e){
    $("#r").empty().text(e.type);
});

Простой пример на jsfiddle

3 голосов
/ 01 мая 2011

Я не думаю, что jQuery поддерживает какие-либо подстановочные знаки (это будет сложно и чревато опасностями), но список стандартных событий конечен (хотя, к сожалению, он немного разбросан по спецификации DOM2 спецификацию DOM2 HTML и спецификацию DOM3 ), вы всегда можете просто перечислить их.jQuery позволяет вам давать несколько имен событий для привязки (разделенных пробелами), например:

$('#some-el').bind('click dblclick mouseover mouseout' /* etc.*/,function(e){
    console.log(e.type);
});
0 голосов
/ 02 февраля 2015

Я взял сценарий Марка Колемана и немного улучшил его для своих нужд.

Я хотел бы поделиться им с вами: http://jsfiddle.net/msSy3/65/

var lastEvent = null,
    countEvent = 0;
$("#test").bind("blur focus focusin focusout load resize scroll unload click" + " dblclick mousedown mouseup mousemove mouseover mouseout mouseenter " + "mouseleave change select submit keydown keypress keyup error", function (e) {
    if (lastEvent !== e.type) {
        countEvent++;
        $("#r").prepend("<span>" + countEvent + ": " + e.type + "<br></span>");
        $("#r > span:nth-child(21)").remove();
        lastEvent = e.type;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...