我想使用通配符(我认为不存在?)完成以下代码
myObject.element = document.getElementsByClassName('js-myObject');
myObject.element.addEventListener('click', myObject.click);
myObject.element.addEventListener('mouseover', myObject.mouseover);
//etc..
到目前为止,我有以下内容
myObject.controller = function(e){
if( (e.type in myObject) && (typeof myObject[e.type] ==='function') ){
myObject[e.type](e);
}
};
//but the listeners still have to be assigned as such
myObject.element = document.getElementsByClassName('js-myObject');
myObject.element.addEventListener('click', myObject.controller);
myObject.element.addEventListener('mouseover', myObject.controller);
//etc...
// but I want to do (and it doesn't work)
myObject.element.addEventListener('*', myObject.controller);
除了事件数组和 foreach 语句之外,对方法有什么建议吗?
编辑,我目前的解决方案
我已经接受了下面的答案(没有可用的通配符,解析可能的数百个事件是个坏主意)
对于那些寻找类似功能的人,我已经确定了以下方法,至少现在是这样。
for(var prop in myObject){
if (!myObject.hasOwnProperty(prop){continue;}
if (typeof myObject[prop] !== 'function'){continue;}
myObject.element.addEventListener(prop, myObject[prop]);
}
好处是自定义事件的处理程序,我不必返回并为其添加侦听器。缺点是我必须确保在定义每个 myObject.someEvent() 之后调用此函数。我在 myObject.init(); 中调用它这对我来说很好。请注意,此解决方案不符合我以前的规格,因为它使用了 for/each 循环——但它完成了我真正想要完成的事情,非常感谢@torazaburo 明确定义了我的技术限制和缺乏智慧初步计划。
原文由 Ken Sherman 发布,翻译遵循 CC BY-SA 4.0 许可协议
没有添加
*
侦听器的功能,我怀疑您是否想要在某个元素上监听数百个事件。顺便说一下,您应该使用涉及
myObject.controller
形式的通用事件处理程序的自己的架构,而不是使用涉及EventListener
接口和它定义的handleEvent
方法。