2011-05-01 65 views
47

如何使用jQuery綁定DOM元素上的所有事件(即clickkeypressmousedown),而不是單獨列出每個事件?如何綁定DOM元素上的所有事件?

例子:

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

回答

41

有一個簡單(但不準確)的方式來測試所有事件:

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 */ 
}); 
+2

對Chrome 12和FF 5中的textarea或輸入類型按鈕沒有任何幫助。 – Bobby 2011-08-02 22:07:56

+1

@Bobby有一個缺少'.slice(2)' - 我修復了它。 – 2015-04-20 23:34:39

3

我不認爲jQuery的支持任何通配符(這將是困難的,充滿了危險),但標準的事件列表是有限的(但遺憾的是有點整個攤開DOM2 events specDOM2 HTML specDOM3 events spec),你總是可以簡單地列出它們。 jQuery不會讓你給多個事件名稱綁定(空格分隔),例如:

$('#some-el').bind('click dblclick mouseover mouseout' /* etc.*/,function(e){ 
    console.log(e.type); 
}); 
+0

這裏是所有可能的事件(從jQuery的源)的列表:模糊焦點的focusIn事件的內容負載大小調整滾動卸載點擊DBLCLICK鼠標按下鼠標鬆開鼠標移動鼠標懸停鼠標移開了mouseenter鼠標離開變化選擇提交的keydown按鍵KEYUP錯誤文本菜單 – Armin 2011-12-28 12:25:15

+0

不幸的是特定的瀏覽器(?)事件,比如'cut'和'paste'。當然還有自定義事件。 – 2012-04-30 03:05:19

+0

@Armin jQuery似乎沒有提及'onwheel'事件。 – user31782 2017-03-14 14:45:12

7

如果你想多個事件綁定到相同的功能,只需將其用空格分開。

$("#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); 
}); 

Simple example on jsfiddle

6

jQuery的改變它如何保存事件,有a couple ways to extract the list取決於你使用的是哪個版本。我已經encapsulated the "most recent" version in a plugin,但本質上你想要的:

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

這給所有綁定事件的嵌套列表,由「基地」事件(沒有命名空間)進行分組。然而,我只是意識到你想要的所有原生jQuery事件 - 你可以檢查$.event,其中有一些在$.event.special下,但accepted answer仍然是你最好的選擇。你也可以看看jQuery lists as possible binding functions

39

您也可以重新定義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); 
} 
+2

這正是我所希望的。 +1 – RedYetiCo 2016-04-01 14:01:04

0

我已經採取了馬克·科爾曼的腳本併爲我的需求增強了一點。

我想與你分享: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; 
    } 
}); 
4

下面是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); 
}); 

您也可以只使用瀏覽器控制檯(從this answer):

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 
相關問題