Используйте Element.closest()
, чтобы найти, соответствует ли сам элемент или один из его родителей селектору:
class Delegator {
constructor(wrapper) {
this.wrapper = wrapper || document.body;
}
add({ selector, event, callback }) {
this.wrapper.addEventListener(event, e => {
const target = e.target;
if (target.closest(selector)) {
e.preventDefault();
callback(e);
}
})
}
}
Передача ближайшего к обратному вызову:
class Delegator {
constructor(wrapper) {
this.wrapper = wrapper || document.body;
}
add({ selector, event, callback }) {
this.wrapper.addEventListener(event, e => {
const target = e.target;
const actual = target.closest(selector);
if (actual) {
e.preventDefault();
callback(e, actual);
}
})
}
}
И тогда readyLink может получить href
от фактического элемента. Я все равно передал бы событие для других целей (например, вызов preventDefault
).
function readyLink(event, actualTarget) {
let href = actualTarget.href;
history.pushState(null, null, href);
event.preventDefault();
router.fetch(href.split("/").pop());
router.route(href);
}