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


144

在处理浏览器事件时,我已经开始将Safari的touchEvents集成到移动设备中。我发现addEventListeners与条件堆叠在一起。该项目不能使用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);

任何建议或提示,不胜感激!


@RobG可能是因为问题在询问如何复制jQuery的某些功能。我不确定标记是否适合使用。
Michael Martin-Smucker 2014年

公平地说,在我看来,这个问题是不需要的。确实看起来有些老套,已删除。
RobG

Answers:


104

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

/* 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, e.g. '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(){…});

希望它能说明这个概念。

编辑2016-02-25

达格德的评论使我重新审视了这一点。我想现在可以在一个元素上为多个事件添加相同的侦听器,以覆盖正在使用的各种接口类型,这一点现在更为常见,而Isaac的答案很好地利用了内置方法来减少代码(尽管代码本身很少) ,不一定是奖金)。使用ECMAScript 2015扩展的箭头功能可提供:

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

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


4
谢谢您的一句话"It is not common to add the same listener for two different events on the same element."有时(更环保的)开发人员需要听到这一点,才能知道他们做得对:)
Ivan Durst 2015年

1
您不是说“这并不罕见”吗?
dalgard '16

2
@dalgard-现在触摸设备越来越普遍,但仅适用于有限的事件(例如mousemove和touchmove),这已变得越来越普遍。要求显示物理项之后命名事件的短视性,指针移动可能更合适。可以通过触摸或其他设备来实现。在鼠标之前,有x / y轮,我使用的有些有手轮和脚轮(1970年代Stecometer)。也有轨迹球和球体,有些会在3d中移动。
RobG '16

2
@RobG:我正在使用的API是DOM,是的,它的缺点是很多:)但是,这也可能只是避免在相似的侦听器中重复代码的问题。
dalgard

1
@PedroFerreira-是的,当然,当前使用的浏览器可能有一半以上不支持箭头功能,但是它们很有趣,并且始终有Babel。;-)
RobG

119

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

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

154
或直接['mousemove', 'touchmove'].forEach(...)
Dan Dascalescu 2015年

+1并且不需要«ECMAScript 2015箭头功能»扩展!;-)
Pedro Ferreira

@zuckerburg首先,不是真的对数组进行硬编码,而是对strstr进行了硬编码,然后对其进行了拆分,您真的确定这是要走的路吗?您确定这是最容易阅读的方式吗? ['mousemove', 'touchmove'].forEach(function(event) { window.addEventListener(event, handler);}); 这样不仅可以提高可读性,而且不必拆分字符串然后为结果数组中的每个项目运行一个函数,也可以更快。
Iharob Al Asimi

2
@IharobAlAsimi这个代码是4年前写的,我在那个时候找到了我的空格键。字符串拆分与OP对字符串的使用有关
Isaac

1
@IharobAlAsimi我没有编写代码。您说这不可读。显然不是因为您和我都能阅读代码。这就像争论语法。99%的程序员都能很好地阅读代码
扎克伯格

55

清理以撒的答案:

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

编辑

ES6助手功能:

function addMultipleEventListener(element, events, handler) {
  events.forEach(e => element.addEventListener(e, handler))
}

1
仅供参考:map!= forEach
jpoppe

10

为了我; 该代码可以正常工作,并且是处理具有相同(内联)函数的多个事件的最短代码。

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.");
    });
}

正是我想要的。谢谢!
Elharony

10

ES2015:

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

另一种方法是使用for...of循环
花花公子

3

我为您提供了一个更简单的解决方案:

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

我已经对其进行了测试,效果很好,从正面来看,它像这里的其他示例一样紧凑而简单。


1
只有一个.onload可能。也许您覆盖了一个旧的侦听器。根据您的环境,这可能是一个问题。
HolgerJeromin '18年

1

AddEventListener采用简单的字符串表示event.type。因此,您需要编写一个自定义函数来迭代多个事件。

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

    // 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

0

一种方法:

const troll = document.getElementById('troll');

['mousedown', 'mouseup'].forEach(type => {
	if (type === 'mousedown') {
		troll.addEventListener(type, () => console.log('Mouse is down'));
	}
        else if (type === 'mouseup') {
                troll.addEventListener(type, () => console.log('Mouse is up'));
        }
});
img {
  width: 100px;
  cursor: pointer;
}
<div id="troll">
  <img src="http://images.mmorpg.com/features/7909/images/Troll.png" alt="Troll">
</div>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.