将多个事件绑定到一个监听器(没有JQuery)?

在处理浏览器事件时,我已经开始将Safari的touchEvents结合到移动设备中。 我发现addEventListener是与条件相叠加的。 这个项目不能使用JQuery。

标准的事件监听器:

 /* option 1 */ window.addEventListener('mousemove', this.mouseMoveHandler, false); window.addEventListener('touchmove', this.mouseMoveHandler, false); /* option 2, only enables the required event */ var isTouchEnabled = window.Touch || false; window.addEventListener(isTouchEnabled ? 'touchmove' : 'mousemove', this.mouseMoveHandler, false); 

JQuery的bind允许多个事件,如下所示:

 $(window).bind('mousemove touchmove', function(e) { //do something; }); 

有没有一种方法来结合两个事件侦听器在JQuery示例? 例如:

 window.addEventListener('mousemove touchmove', this.mouseMoveHandler, false); 

任何build议或提示,表示赞赏!

在POJS中,您一次添加一个侦听器。 在同一个元素上为两个不同的事件添加同一个侦听器是不常见的。 你可以编写自己的小function来完成这项工作,例如:

 /* Add one or more listeners to an element ** @param {DOMElement} element - DOM element to add listeners to ** @param {string} eventNames - space separated list of event names, eg 'click change' ** @param {Function} listener - function to attach for each event as a listener */ function addListenerMulti(element, eventNames, listener) { var events = eventNames.split(' '); for (var i=0, iLen=events.length; i<iLen; i++) { element.addEventListener(events[i], listener, false); } } addListenerMulti(window, 'mousemove touchmove', function(){…}); 

当然没有经过testing,希望能够展示这个概念。

编辑2016-02-25

达尔加德的评论使我重新审视了这一点。 我猜想为一个元素上的多个事件添加同一个侦听器现在更加常见,以覆盖所使用的各种接口types,而Isaac的答案提供了一种很好的内置方法来减less代码(尽pipe本身的代码更less,不一定是奖金)。 使用ECMAScript 2015箭头函数进行扩展可以:

 function addListenerMulti(el, s, fn) { s.split(' ').forEach(e => el.addEventListener(e, fn, false)); } 

类似的策略可以将同一个侦听器添加到多个元素,但是需要这样做可能是事件委派的一个指示器。

一些紧凑的语法,达到预期的结果

  ("mousemove touchmove".split(" ")).forEach(function(e){ window.addEventListener(e,mouseMoveHandler,false); }); 

ES2015:

 let el = document.getElementById("el"); let handler =()=> console.log("changed"); ['change', 'keyup', 'cut'].forEach(event => el.addEventListener(event, handler)); 

为了我; 这段代码工作正常,并且是用同样的(内联)函数处理多个事件的最短代码。

 var eventList = ["change", "keyup", "paste", "input", "propertychange", "..."]; for(event of eventList) { element.addEventListener(event, function() { // your function body... console.log("you inserted things by paste or typing etc."); }); } 

清理艾萨克的回答:

 ['mousemove', 'touchmove'].map(function(e) { window.addEventListener(e, mouseMoveHandler); }); 

我有一个更简单的解决scheme:

 window.onload = window.onresize = (event) => { //Your Code Here } 

我已经testing过了,它的效果非常好,而且它的结构紧凑,简单,就像这里的其他示例一样。

AddEventListener接受一个表示event.type的简单string。 所以你需要编写一个自定义的函数来遍历多个事件。

这是通过使用.split(“”)在jQuery中处理,然后遍历列表设置每个types的eventListeners。

  // Add elem as a property of the handle function // This is to prevent a memory leak with non-native events in IE. eventHandle.elem = elem; // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = types.split(" "); var type, i = 0, namespaces; while ( (type = types[ i++ ]) ) { <-- iterates thru 1 by 1