事件冒泡与查询选择器
Event bubbling with querySelector
我有一个附加到容器的事件侦听器,我想过滤正在点击的内容。
在下面的示例中,我过滤掉了UL.head
点击。
<div>
<ul class="head">
<li data-test="...">1</li>
<li>2</li>
<li>3</li>
</ul>
<ul class="head">
<li>1</li>
<li>2</li>
<li data-test="...">3</li>
</ul>
<ul class="head">
<li>1</li>
<li data-test="...">2</li>
<li>3</li>
</ul>
</div>
document.querySelector('div').addEventListener('click', function(e) {
var ul = findParentByClass(e.target, ".head");
if(ul) { // clicke a UL }
});
function findParentByClass(node, cls) {
while (node && !hasClass(node, cls)) {
node = node.parentNode;
}
return node;
}
我想重现与findParentByClass
类似的功能,但它会findParentByQuerySelector
.所以我可以做这样的事情:
li = findParentByQuerySelector('li:[data-test]');
if(li) { // clicked li with data-test attribute }
我很困惑如何在这个冒泡的事件中实施querySelector
。
您可以简单地使用 Element.matches
方法:
function findParentBySelector(node, selector) {
while (node && !node.matches(selector)) {
node = node.parentNode;
}
return node;
}
但是,请注意,不幸的是,此方法的实现不一致。
或者,您可以使用更常见的Element.querySelectorAll
,它与指定元素的子元素匹配。这确实意味着您需要考虑祖父母和父母:
function findParentBySelector(node, selector) {
while (node && node.parentNode) {
let list = node.parentNode.querySelectorAll(selector);
if (Array.prototype.includes.call(list, node)) {
return node
}
node = node.parentNode;
}
return node;
}
但我不会完全称这种方法漂亮。
相关文章:
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- jQuery中的查询选择器导致无法识别的表达式
- j查询选择器不选择对象
- 事件冒泡与查询选择器
- 将查询选择器保存在要追加的变量中不起作用
- 不包含块引用的节点的查询选择器
- 查询选择器设置文本值
- 如何使用纯 Javascript 和文档查询选择器实现 jQuery .on() 函数
- 使用查询选择器查找同级行中包含的下一个单元格
- WebRTC文件传输和语法查询选择器
- 如何在聚合物中的自定义元素中成功查询选择器
- 聚合物查询选择器在聚合物元素中找不到自定义聚合物元素
- 更新的问题::查询选择器可能存在PhantomJS/Javascript问题
- 自定义查询选择器全部实现
- j查询选择器变量语法纠错
- j查询选择器无法正常工作
- IE8 查询选择器空值与正常空值
- 查询选择器全部不起作用
- Polymer.dom:dom元素的作用域查询选择器
- 如何使用查询选择器来选择常规短语