Связывание нескольких событий с слушателем (без 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? ex:
window.addEventListener('mousemove touchmove', this.mouseMoveHandler, false);
Приветствуются любые предложения или советы!
Ответы
Ответ 1
В 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));
}
Аналогичная стратегия может добавить один и тот же прослушиватель к нескольким элементам, но необходимость сделать это может быть индикатором делегирования событий.
Ответ 2
Некоторый компактный синтаксис, который достигает желаемого результата, POJS:
"mousemove touchmove".split(" ").forEach(function(e){
window.addEventListener(e,mouseMoveHandler,false);
});
Ответ 3
Убираю Исаака, отвечаю:
['mousemove', 'touchmove'].forEach(function(e) {
window.addEventListener(e, mouseMoveHandler);
});
РЕДАКТИРОВАТЬ
ES6 вспомогательная функция:
function addMultipleEventListener(element, events, handler) {
events.forEach(e => element.addEventListener(e, handler))
}
Ответ 4
Для меня; этот код работает отлично и является самым коротким кодом для обработки нескольких событий с одинаковыми (встроенными) функциями.
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.");
});
}
Ответ 5
ES2015:
let el = document.getElementById("el");
let handler =()=> console.log("changed");
['change', 'keyup', 'cut'].forEach(event => el.addEventListener(event, handler));
Ответ 6
У меня есть более простое решение для вас:
window.onload = window.onresize = (event) => {
//Your Code Here
}
Я тестировал это, он отлично работает, с плюсовой стороны он компактный и несложный, как и другие примеры здесь.
Ответ 7
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
Ответ 8
Один из способов, как это сделать:
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>