добавление нескольких прослушивателей событий в один элемент

Итак, моя дилемма заключается в том, что я не хочу писать два раза один и тот же код. Один раз для события click, а другой для touchstart событие.

вот исходный код:

document.getElementById('first').addEventListener('touchstart', function(event) {
    do_something();
    });

document.getElementById('first').addEventListener('click', function(event) {
    do_something(); 
    });

Как я могу это компактный? Должен быть более простой способ!

8 ответов


возможно, вы можете использовать вспомогательную функцию следующим образом:

// events and args should be of type Array
function addMultipleListeners(element,events,handler,useCapture,args){
  if (!(events instanceof Array)){
    throw 'addMultipleListeners: '+
          'please supply an array of eventstrings '+
          '(like ["click","mouseover"])';
  }
  //create a wrapper to be able to use additional arguments
  var handlerFn = function(e){
    handler.apply(this, args && args instanceof Array ? args : []);
  }
  for (var i=0;i<events.length;i+=1){
    element.addEventListener(events[i],handlerFn,useCapture);
  }
}

function handler(e) {
  // do things
};

// usage
addMultipleListeners(
    document.getElementById('first'),
    ['touchstart','click'],
    handler,
    false);

Я знаю, это старый вопрос, но я думал, что некоторые могут найти этот подход полезным; он может быть применен к любой аналогично повторяющегося кода:

ЕС6

['click','ontouchstart'].forEach( evt => 
    element.addEventListener(evt, dosomething, false)
);

в ES5

['click','ontouchstart'].forEach( function(evt) {
    element.addEventListener(evt, dosomething, false);
});

вы можете просто определить функцию и передать ее. Анонимные функции никоим образом не являются особенными, все функции могут передаваться как значения.

var elem = document.getElementById('first');

elem.addEventListener('touchstart', handler, false);
elem.addEventListener('click', handler, false);

function handler(event) {
    do_something();
}

Если do_something функция фактически делает что-то с любыми заданными аргументами, вы можете просто передать ее как обработчик событий.

var first = document.getElementById('first');
first.addEventListener('touchstart', do_something, false);
first.addEventListener('click', do_something, false);

для большого количества событий это может помочь:

var element = document.getElementById("myId");
var myEvents = "click touchstart touchend".split(" ");
var handler = function (e) {
    do something
};

for (var i=0, len = myEvents.length; i < len; i++) {
    element.addEventListener(myEvents[i], handler, false);
}

06/2017 обновления:

Теперь, когда новые языковые функции более доступны, вы можете упростить добавление ограниченного списка событий, которые разделяют один слушатель.

const element = document.querySelector("#myId");

function handleEvent(e) {
    // do something
}
// I prefer string.split because it makes editing the event list slightly easier

"click touchstart touchend touchmove".split(" ")
    .map(name => element.addEventListener(name, handleEvent, false));

Если вы хотите обрабатывать множество событий и иметь разные требования к каждому слушателю, вы также можете передать объект большинство людей склонны забывать.

const el = document.querySelector("#myId");

const eventHandler = {
    // called for each event on this element
    handleEvent(evt) {
        switch (evt.type) {
            case "click":
            case "touchstart":
                // click and touchstart share click handler
                this.handleClick(e);
                break;
            case "touchend":
                this.handleTouchend(e);
                break;
            default:
                this.handleDefault(e);
        }
    },
    handleClick(e) {
        // do something
    },
    handleTouchend(e) {
        // do something different
    },
    handleDefault(e) {
        console.log("unhandled event: %s", e.type);
    }
}

el.addEventListener(eventHandler);

document.getElementById('first').addEventListener('touchstart',myFunction);

document.getElementById('first').addEventListener('click',myFunction);
    
function myFunction(e){
  e.preventDefault();e.stopPropagation()
  do_something();
}    

вы должны использовать e.stopPropagation() потому что, если нет, ваша функция будет уволен дважды на мобильном


У меня есть небольшое решение, которое придает прототип

  EventTarget.prototype.addEventListeners = function(type, listener, options,extra) {
  let arr = type;
  if(typeof type == 'string'){
    let sp = type.split(/[\s,;]+/);
    arr = sp;   
  }
  for(let a of arr){
    this.addEventListener(a,listener,options,extra);
  }
};

позволяет дать ему строку или массив. Строка может быть разделена пробелом(' '), запятой(',') или точкой с запятой(';')


этот мини-javascript libary (1.3 KB) может делать все эти вещи

https://github.com/Norair1997/norjs/

nor.event(["#first"], ["touchstart", "click"], [doSomething, doSomething]);