<ul id="list">
<li class="yes">1</li>
<li class="no">2</li>
<li class="no">3</li>
<li>...</li>
<li class="yes">100</li>
</ul>
function on(elSelector, eventName, selector, fn) {
var element = document.querySelector(elSelector);
element.addEventListener(eventName, function(event) {
var possibleTargets = element.querySelectorAll(selector);
var target = event.target;
for (var i = 0, l = possibleTargets.length; i < l; i++) {
var el = target;
var p = possibleTargets[i];
while(el && el !== element) {
if (el === p) {
return fn.call(p, event);
}
el = el.parentNode;
}
}
});
}
on('#list', 'click', '.yes', function(e) {
// this function is only called, when a list item with 'yes' class is called
console.log(e.target); // this is the clicked list item
});
<body>
. Конечно, вешать на самый корень плохо, по причинам производительности и разграничения кода. Но вешать на тег-родитель, скажем, ленты новостей - дело благое.$('ul.news-list').on('click',' div > a.button', function() {
//
});
var obj = {
div: $('div'),
onClick: function () {
counter++;
this.div.text(counter);
},
init: function() {
$('div:nth-child(2)').click(this.onClick.bind(this));
}
};
Почему не работает :last-child селектор?https://jsfiddle.net/5jrpsxnd/1/