Привязка нескольких событий к прослушивателю (без JQuery)?



во время работы с событиями браузера я начал включать touchEvents Safari для мобильных устройств. Я нахожу, что 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? ex:



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


любой предложения или советы приветствуются!

603   8  

8 ответов:

в 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

комментарий Дальгарда заставил меня вернуться к этому. Я думаю, что добавление одного и того же слушателя для нескольких событий на одном элементе теперь более распространено, чтобы охватить различные интерфейсы типы в использовании, и ответ Исаака предлагает хорошее использование встроенных методов для уменьшения кода (хотя меньший код сам по себе не обязательно является бонусом). Расширено с помощью функций стрелки ECMAScript 2015 дает:

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

аналогичная стратегия может добавить один и тот же прослушиватель к нескольким элементам, но необходимость этого может быть индикатором для делегирования событий.

какой-то компактный синтаксис, который позволяет достичь желаемого результата, POJS:

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

очистка ответа Исаака:

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

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

У меня есть простое решение для вас:

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

Я проверил это, и он отлично работает, с положительной стороны он компактный и несложный, как и другие примеры здесь.

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

это обрабатывается в 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

один из способов как это сделать:

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>

Comments

    Ничего не найдено.