2016-09-05 4 views
3

У меня есть глобальная переменная, назовем ее jsEvents, которая служит диспетчером для всех событий в проекте. Есть около 200 слушателей и примерно такое же количество пользовательских событий, таких какОтслеживать все пользовательские события в глобальной переменной

$(jsEvents).on('customEvent', function(){ 
//doing something 
}) 

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

Один из способов - написать console.log в каждом прослушивании событий, но возможно ли прослушать any событие? И введите его имя?

Что-то вроде

$(jsEvents).on('*', function(){ 
//here I want to console.log event's name 
}) 
+0

делает эту помощь http://stackoverflow.com/questions/3489433/monitor-all-javascript-events-in-the-browser-console – baao

+0

Это оленья кожа , потому что я использую персонализированные имена событий, и это не элемент DOM. –

ответ

3

Для отладки вы можете переопределить отправку объекта события jQuery. Нечто подобное, например:

var temp = $.event.dispatch; 

$.event.dispatch = function(event){ 
    // the event that is passed is the native event, if you want the jquery 
    // event, you need the fixed event. 
    console.log(jQuery.event.fix(event)); 
    temp.call(this, event); 
} 

https://jsfiddle.net/8a530fjx/

+0

Это самый близкий матч. Что-то, к чему я также пришел, выполняет функцию 'trigger' в jQuery. Я до сих пор не знаю, какое имя объекта вызывало событие, но я могу отфильтровать события DOM, и я могу увидеть название события. –

0

Я думаю, что это может быть сделано путем добавления дополнительных данных в пользовательском событии и извлечения же в слушателе

var event = new CustomEvent('build', { 'detail': elem.dataset.time }); 
    function eventHandler(e) { 
    console.log('The time is: ' + e.detail); 
    } 

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

Eidt: К сожалению, это требует, чтобы обеспечить детали в CustomEvent, в то время как при добавлении детали можно избежать с помощью console.log("Custom event is " event.type);

var event = new CustomEvent('build'); 
function eventHandler() { 
console.log('The event is: ' + event.type); 
} 
document.addEventListener('build',eventHandler,true); 
document.dispatchEvent(event); 
+0

Вы имеете в виду добавление дополнительных данных в _each и каждое пользовательское событие, а затем в _each и every_ listenener? Это то, что я не хочу делать - даже для копирования потребуется несколько часов - я действительно не хочу переписывать весь код только для его отладки. Поэтому вопрос заключается в том, как находить и слушать все пользовательские события, не переписывая их. –

+0

вы не упомянули, что не хотите изменять существующего слушателя: «Один способ - написать console.log в каждом прослушивателе событий, но возможно ли прослушивание какого-либо события? И введите его имя?» - что означает, что вы будете разжигать своего слушателя. – Manoj

+0

_one way_ - изменить каждого слушателя и его очевидное. И сложно.Я ищу другой путь. –

0

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

1

Я думаю, что вам нужно, это способ получить все события связаны с одним элементом:

function getAllEvents(element) { 
    var result = []; 
    var events = $._data(element[0], "events"); 
    for(e in events){ 
     result.push(e); 
    } 
    return result.join(' '); 
} 

затем использовать его для создания отладчика слушателя:

//listener 
$('#testElem').on(allEvents, function(e){ 
    console.log('the event is :', e); 
}); 

Demo: https://jsfiddle.net/qhwfzxzb/

+0

Я не использую элемент DOM в качестве диспетчера, поэтому в нем нет свойства '$ ._ data'. jQuery позволяет использовать глобальное свойство 'any' в качестве диспетчера. Не только элементы DOM. –

Смежные вопросы