Аналог jquery on() в javascript

221
05 февраля 2020, 07:40

Есть ли в javascript аналог для перегрузки функции из jQuery?

.on(eventName, selector, handler)

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

Answer 1

Для одного родительского написал, для нескольких надо будет обернуть в цикл.
Ну и кроссбраузерность closest не очень - вероятно, придётся подключить полифилл.

document.querySelector("main").addEventListener('click', function (e) { 
  if (e.target.closest("p")) { 
    console.log("clicked " + e.target.outerHTML); 
  } 
})
main :hover { background: rgba(255, 0, 0, .25) }
<main> 
  <div>123 <span>span <em>em</em></span></div> 
  <p>456 <span>span <em>em</em></span></p> 
  <section>789 <span>span <em>em</em></span></section> 
</main>

Answer 2
document.querySelector('#id').addEventListener('click', function () {
    alert('addEventListener');
}, false);

https://developer.mozilla.org/ru/docs/Web/API/EventTarget/addEventListener

Answer 3

Не совсем понятно, что именно вы сделали и что у вас не получается, потому что и при помощи чистого js и при помощи jquery вы функции вешаете в момент вызова. Поэтому вам в любом случае либо вызывать ваши функции заново, либо вешать событие на родителя примерно так:

var container = document.getElementById("container"); 
// Отслеживаем клик на родителе 
container.addEventListener("click", function(event) { 
  //   останавливаем всплытие 
  event.stopPropagation(); 
  var clicked = event.target; 
  //   Проверяем наличие нужного нам класса на элементе 
  //   по которому кликнули внутри родителя 
    if (clicked.closest(".element")) { 
    alert("Клик"); 
  } 
}); 
 
var create = document.getElementById("create"); 
 
// Создаем новые элементы по клику на кнопку 
create.addEventListener("click", function(event) { 
  var newElements = document.createElement("div"); 
  newElements.innerHTML = 
    '<div class="block"></div><div class="element element_new">клик вызовет событие</div>'; 
  container.appendChild(newElements); 
});
.container { 
  text-align: center; 
} 
 
.btn { 
  display: inline-block; 
  margin-bottom: 20px; 
} 
 
.element { 
  height: 30px; 
  background-color: orange; 
 
  line-height: 30px; 
  cursor: pointer; 
} 
 
.element_new { 
  background-color: rgb(39, 156, 145); 
} 
 
.element:hover { 
  background-color: red; 
} 
 
.block { 
    height: 30px; 
  background-color: #000; 
}
<div id="container" class="container"> 
  <button id="create" class="btn">Создать еще элементов</button> 
  <div class="element">клик вызовет событие</div> 
  <div class="block"></div> 
  <div class="element">клик вызовет событие</div> 
</div>

Answer 4

У меня получилось такое:

document.addEventListener('click', {
    handleEvent: function(eve) {
    var matches = document.querySelectorAll(this.selector);
        if (Array.from(matches).indexOf(eve.target) != -1) {
        log(eve.target.textContent);
    }
    },
  selector: '.example2'
});
READ ALSO
От куда эти отступы ? И как их убрать?

От куда эти отступы ? И как их убрать?

Только учусь верстать сайты, во время работы столкнулся с таком проблемой как отступы по бокамНе могу их убрать, да и вообще не знаю от куда...

189
Input type file js

Input type file js

При выборе определенного файла, содержимое тега input type="file" меняется на название этого файлаПодскажите, как с помощью JS(JQuery), заменить то, что...

193
Как добавить форму заказа на сайт?

Как добавить форму заказа на сайт?

Итак, есть сайт https://uds-loyaltyru/, на нем есть кнопка "Подробнее об инструментах для бизнеса" И есть сайт-зеркало, и на нем тоже есть эта кнопка, но она...

372