Tôi đã tạo một chức năng nhà máy phát hiện sự kiện đa mục đích. Với nó, tôi có thể biến đối tượng thành sự kiện phát. Mã cho nhà máy phát sự kiện ở bên dưới nếu có ai muốn xem hoặc sử dụng nó.Lấy một mảng của tất cả các sự kiện DOM có thể
Câu hỏi của tôi là làm cách nào để có danh sách các sự kiện từ DOM. Xin lưu ý tôi không cố gắng để có được một danh sách các sự kiện bị ràng buộc. Tôi muốn có một danh sách tất cả các sự kiện có thể. Tôi muốn thêm phương thức "ống" vào bộ phát. Phương thức này sẽ lấy một đối tượng DOM và liên kết với tất cả các sự kiện có thể xảy ra, sau đó khi bất kỳ sự kiện nào kích hoạt mỗi sự kiện sẽ kích hoạt một sự kiện có cùng tên trong bộ phát.
Tôi không tưởng tượng có cách nào để thực hiện việc này. Tôi đã chuẩn bị để tạo một mảng các tên sự kiện được mã hoá cứng, nhưng nếu tôi có thể lấy mảng cho DOM thay vì sẽ tốt hơn nhiều và vẫn hoạt động nếu W3C chuẩn hóa nhiều loại sự kiện hơn.
P.S. Nếu bạn làm việc cho W3C thì đây là loại crap khiến mọi người ghét DOM. Vui lòng ngừng xử lý JavaScript như ngôn ngữ đồ chơi. Nó không phải là một ngôn ngữ đồ chơi và cần nhiều hơn đồ chơi DOM của bạn.
/**
* 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); });
}
}
}
Tôi đã hỏi một câu hỏi tương tự: [Có thể lập trình bắt tất cả các sự kiện trên trang trong trình duyệt không?] (Http://stackoverflow.com/questions/5107232/is-it-possible-to-programmatically -catch-all-events-on-the-page-in-the-browser). –