我的任务是将所有jquery代码转换为es6兼容代码。
示例:
jQuery
$('.class1 .class2').on('click', function(e) {
// logic here
}
兼容ES6
const test = document.querySelector('.class1 .class2');
test.addEventListener('click', (e) => {
//logic here
});
这很好,但是我无法转换以后注册的dom点击事件。
示例:
jQuery
$(document).on('click', '.class1 .pagination a',
function(e) {
//logic here
})
我正在尝试做的事情:
var classname = document.querySelectorAll(".class1 .pagination a");
Array.from(classname).forEach(function(element) {
element.addEventListener('click', (e)=>{
e.preventDefault();
alert(e);
});
});
稍后注册类.class1 .pagination a
,因此类名将为空。
但是使用jQuery $(document).on('click', '.class1 .pagination a')
可以正常工作。
关于如何将类似$(document).on('click', '.class1 .pagination a')
的事件转换为es6的任何指针?
答案 0 :(得分:2)
您可以通过使用event target来检查Element.matches()来使用事件委托:
const delegate = (container, evtType, targets, cb) => {
const cont = (container === document || container instanceof HTMLElement) ?
container : document.querySelector(container);
if (!container) throw new Error('Event container not found');
document.addEventListener(evtType, e => {
if (!e.target.matches(targets)) return;
cb(e);
});
}
delegate(document, 'click', 'span, .class, #id, .container .inner a', (e) => console.log(e.target.innerText));
<div class="class">A class</div>
<div id="id">An id</div>
<span>An element</span>
<div class="container">
<div class="inner"> <a href="#">Nested Selectors</a></div>
</div>
<div>Not delegated</div>
答案 1 :(得分:2)
您可以将事件附加到文档上,并使用matches()
函数通过选择器进行过滤,例如:
document.addEventListener('click', clickEvent)
function clickEvent() {
if (!event.target.matches('.class1 .pagination a')) return
console.log(event.target)
}
//--JUST FOR DEMO START
setTimeout(function() {
$('ul').append("<li class='class1'><div class='pagination'> <a href='#'>Coffe</a></div></li>");
}, 1000);
//--JUST FOR DEMO END
document.addEventListener('click', clickEvent)
function clickEvent() {
if (!event.target.matches('.class1 .pagination a')) return
console.log(event.target)
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class=”characters”>
<li class='class1'>
<div class='pagination'> <a href="#">Milk</a></div>
</li>
<li class='class2'>
<div class='pagination'> <a href="#">Tea</a></div>
</li>
</ul>