使用特定选择器在单击时添加事件处理程序
Add event handler on click with specific selector
我正在尝试在 li
选择器上的文档上添加事件处理程序。在 JQuery 中,这将起作用:
$('li').click(function(){
var justify = $(this).attr('data-cid');
alert(justify);
});
如何在 JavaScript 中执行 完全相同的 操作?
使用getElementsByTagName and addEventListener
如果我理解正确,那应该可以解决问题。
可以使用document.querySelectorAll("li")
、for..of loop
迭代li
个元素,设置事件监听器; element.dataset获取data-*
属性值
for (let li of document.querySelectorAll("li")) {
li.addEventListener("click", function() {
let justify = this.dataset.cid;
})
}
或者
var li = [].slice.call(document.querySelectorAll("li"));
li.forEach(function(el) {
el.addEventListener("click", function() {
var justify = this.dataset.cid;
})
})
尝试如下。
var lis = document.getElementsByTagName('li');
for(var i = 0; i < lis.length; i++) {
(function(i) {
lis[i].addEventListener('click', function() {
alert(this.dataset.cid);
}, false);
})(i);
}
<ul>
<li data-cid="1">1</li>
<li data-cid="2">2</li>
<li data-cid="3">3</li>
<li data-cid="4">4</li>
<li data-cid="5">5</li>
</ul>
这更像是 jQuery 的情况。
它将单个事件绑定到 window 并检查事件目标是什么,如果找到匹配项,它将触发回调,并将上下文设置为单击的元素。
const $ = function(selector) {
const listeners = {}
const bindListener = function(event) {
listeners[event] = []
window.addEventListener(event, function (e) {
// iterate through the subscribed events to find any matching selectors
const matches = listeners[event].filter(x => e.target.matches(x.selector))
if (matches) {
matches.forEach(x => x.cb.call(e.target, e))
}
})
}
// bind a single event listener to the window for each event type
bindListener('click')
bindListener('mouseover')
// return your api
return {
on(event, cb) {
listeners[event].push({ selector, cb })
},
off(event, cb) {
listeners = listeners[event].filter(x => x.cb !== cb)
}
}
}
$('li').on('click', function(e){
console.log(this.dataset.cid)
})
$('li:first-of-type').on('mouseover', function (e) {
console.log('mouseover first li', this.dataset.cid)
})
$('li:last-of-type').on('click', function (e) {
console.log('clicked last li', this.dataset.cid)
})
<ul>
<li data-cid="foo">foo</li>
<li data-cid="bar">bar</li>
<li data-cid="baz">baz</li>
</ul>
我正在尝试在 li
选择器上的文档上添加事件处理程序。在 JQuery 中,这将起作用:
$('li').click(function(){
var justify = $(this).attr('data-cid');
alert(justify);
});
如何在 JavaScript 中执行 完全相同的 操作?
使用getElementsByTagName and addEventListener
如果我理解正确,那应该可以解决问题。
可以使用document.querySelectorAll("li")
、for..of loop
迭代li
个元素,设置事件监听器; element.dataset获取data-*
属性值
for (let li of document.querySelectorAll("li")) {
li.addEventListener("click", function() {
let justify = this.dataset.cid;
})
}
或者
var li = [].slice.call(document.querySelectorAll("li"));
li.forEach(function(el) {
el.addEventListener("click", function() {
var justify = this.dataset.cid;
})
})
尝试如下。
var lis = document.getElementsByTagName('li');
for(var i = 0; i < lis.length; i++) {
(function(i) {
lis[i].addEventListener('click', function() {
alert(this.dataset.cid);
}, false);
})(i);
}
<ul>
<li data-cid="1">1</li>
<li data-cid="2">2</li>
<li data-cid="3">3</li>
<li data-cid="4">4</li>
<li data-cid="5">5</li>
</ul>
这更像是 jQuery 的情况。
它将单个事件绑定到 window 并检查事件目标是什么,如果找到匹配项,它将触发回调,并将上下文设置为单击的元素。
const $ = function(selector) {
const listeners = {}
const bindListener = function(event) {
listeners[event] = []
window.addEventListener(event, function (e) {
// iterate through the subscribed events to find any matching selectors
const matches = listeners[event].filter(x => e.target.matches(x.selector))
if (matches) {
matches.forEach(x => x.cb.call(e.target, e))
}
})
}
// bind a single event listener to the window for each event type
bindListener('click')
bindListener('mouseover')
// return your api
return {
on(event, cb) {
listeners[event].push({ selector, cb })
},
off(event, cb) {
listeners = listeners[event].filter(x => x.cb !== cb)
}
}
}
$('li').on('click', function(e){
console.log(this.dataset.cid)
})
$('li:first-of-type').on('mouseover', function (e) {
console.log('mouseover first li', this.dataset.cid)
})
$('li:last-of-type').on('click', function (e) {
console.log('clicked last li', this.dataset.cid)
})
<ul>
<li data-cid="foo">foo</li>
<li data-cid="bar">bar</li>
<li data-cid="baz">baz</li>
</ul>