javascript - 更改事件委托的 currentTarget
问题描述
我正在尝试在网站上添加一些委托事件,但我没有与传统侦听器回调签名 ( function( event ) {}
) 匹配的函数,并且要获取当前侦听元素,我需要将另一个参数传递给函数。
这是我设法实现的目标:
const delegate = function( element, events, target, callback ) {
events.split( " " ).forEach( event => element.addEventListener( event, function( e ) {
let initiator;
if ( e.target && ( initiator = e.target.closest( target ) ) ) {
callback( e, initiator );
}
} ) );
};
let count = 0;
delegate( document, "click", ".js-test-delegate", function( event, elem ) {
elem.innerHTML = `you click on this container ${++count} time(s)`;
} );
const div = document.createElement("div")
div.classList.add( "js-test-delegate" );
document.querySelector( ".container" ) .appendChild( div );
.container{
width: 300px;
height: 300px;
background: rgba(256,0,0,.2);
}
.js-test-delegate{
width: 100px;
height: 100px;
position: relative;
top: 100px;
left: 100px;
background: rgba(0,256,0,.2);
}
<div class="container"></div>
有没有办法elem
在事件中传递该元素,让他替换currentTarget
属性以获得更简单的行为?
我尝试修改 Event
,但属性如currentTarget
只读或克隆事件,event = new Event( "click", e)
但此时未设置。target
currentTarget
当然,这需要在 vanilla js 中。
谢谢 !
解决方案
用于.call()
以元素引用作为 的值调用回调this
:
if ( e.target && ( initiator = e.target.closest( target ) ) ) {
callback.call(initiator, e);
}
在回调中,this
将引用“发起者”,您不需要其他参数。
推荐阅读
- python - Python正则表达式匹配不包括特定字符的字符串
- python - 循环pytorch中的内存泄漏
- android-studio - 错误:此项目使用 AndroidX 依赖项,但未启用“android.useAndroidX”属性。在 gradle.prop 中将此属性设置为 true
- flutter-layout - 我想在 Flutter 中创建类似的东西
- c - 堆排序,数组的索引从 1 开始而不是 0
- java - 配置带有子项目的 Maven 项目以访问所有 Java 设施
- python-3.x - sns.pairplot 显示密度曲线而不是直方图
- python - 如何根据字典的左值执行插入排序
- python - 如何使用python在CMD中执行命令?
- python - 如何删除列表中两个连续的重复字符串之一?