다목적 팩토리 이벤트 이미 터 팩토리 함수를 만들었습니다. 그것으로 객체를 이벤트 이미 터로 변환 할 수 있습니다. 누구든지 모양을 원한다면 이벤트 이미 터 팩토리 코드가 아래에 있습니다.모든 DOM 이벤트의 배열 가져 오기
내 질문은 어떻게 DOM에서 이벤트 목록을 얻을 수 있습니다. 참고 : 바인딩 된 이벤트 목록을 가져 오지 않으려 고합니다. 가능한 모든 이벤트의 목록을 원합니다. 에미 터에 "파이프"방법을 추가하고 싶습니다. 이 메소드는 DOM 객체를 취하여 가능한 모든 이벤트에 바인딩 한 다음 해당 이벤트 중 하나가 실행되면 각각이 이미 터에서 같은 이름의 이벤트를 트리거합니다.
나는 이것을 할 방법이 없다고 생각합니다. 하드 코딩 된 이벤트 이름 배열을 만들 준비가되었지만 대신 DOM에 대한 배열을 얻을 수 있다면 W3C가 더 많은 이벤트 유형을 표준화하는 경우 훨씬 더 좋을 것이며 여전히 작동합니다.
P. W3C에서 일하는 사람은 모두가 DOM을 싫어하게 만드는 종류의 쓰레기입니다. 장난감 언어처럼 자바 스크립트 처리를 중단하십시오. 그것은 장난감 언어가 아니며 장난감 DOM 이상을 필요로합니다.
/**
* Creates a event emitter
*/
function EventEmitter() {
var api, callbacks;
//vars
api = {
"on": on,
"trigger": trigger
};
callbacks = {};
//return the api
return api;
/**
* Binds functions to events
* @param event
* @param callback
*/
function on(event, callback) {
var api;
if(typeof event !== 'string') { throw new Error('Cannot bind to event emitter. The passed event is not a string.'); }
if(typeof callback !== 'function') { throw new Error('Cannot bind to event emitter. The passed callback is not a function.'); }
//return the api
api = {
"clear": clear
};
//create the event namespace if it doesn't exist
if(!callbacks[event]) { callbacks[event] = []; }
//save the callback
callbacks[event].push(callback);
//return the api
return api;
function clear() {
var i;
if(callbacks[event]) {
i = callbacks[event].indexOf(callback);
callbacks[event].splice(i, 1);
if(callbacks[event].length < 1) {
delete callbacks[event];
}
return true;
}
return false;
}
}
/**
* Triggers a given event and optionally passes its handlers all additional parameters
* @param event
*/
function trigger(event ) {
var args;
if(typeof event !== 'string' && !Array.isArray(event)) { throw new Error('Cannot bind to event emitter. The passed event is not a string or an array.'); }
//get the arguments
args = Array.prototype.slice.apply(arguments).splice(1);
//handle event arrays
if(Array.isArray(event)) {
//for each event in the event array self invoke passing the arguments array
event.forEach(function(event) {
//add the event name to the begining of the arguments array
args.unshift(event);
//trigger the event
trigger.apply(this, args);
//shift off the event name
args.shift();
});
return;
}
//if the event has callbacks then execute them
if(callbacks[event]) {
//fire the callbacks
callbacks[event].forEach(function(callback) { callback.apply(this, args); });
}
}
}
비슷한 질문을했습니다 : [프로그래밍 방식으로 브라우저의 페이지에서 모든 이벤트를 catch 할 수 있습니까?] (http://stackoverflow.com/questions/5107232/is-it-possible-to-programmatically) -catch-all-events-the-the-browser-in-the-browser)를 사용합니다. –