事件处理程序中this,currentTarget, target所表示不同的值

探讨了在事件处理程序中currentTarget与target的区别,currentTarget指向事件处理程序绑定的元素,而target则指向实际触发事件的元素。通过直接绑定和事件委托两种场景对比,深入解析了this、currentTarget与target之间的关系。

在事件处理程序中,当触发了dom中的某个事件,浏览器会将一个event对象传入到事件处理程序,这个对象包含所有与事件有关的信息,比如:导致事件的元素、事件的类型等。event对象包含一些属性和方法,其中currentTarget和target与事件目标有关。

对currentTarget和target属性的官方说明:
currentTarget:事件处理程序当前正在处理的那个元素
target: 事件的目标
this并不是event特有的属性,它在事件处理程序中代表接收事件的元素
在事件处理程序内部,对象this始终等于currentTarget的值, target的值会根据以下两种情况有所不同,因为target是事件的实际点击目标。
1.直接将事件处理程序绑定给目标元素。

<body>
<div id="parent">
<input type="button" value="hi" id="myBtn">
</div>

<script>
var btn = document.getElementById('myBtn')
var par = document.getElementById('parent');
btn.onclick = function(e) {
console.log(e.currentTarget === btn);
console.log(e.target === btn);
console.log(this === btn);
}
</script>
</body>

1
可以看出当直接将事件处理程序绑定给要点击的目标时,this,currenTarget,target所指代的目标是相同的,也就是说接收事件处理程序的元素和实际中被点击的元素是同一个。

2.事件委托。
事件处理程序绑定在父元素上,然后再冒泡阶段逐级向外扩散,遇到事件处理程序就触发。

<body>
<div id="parent">
<input type="button" value="hi" id="myBtn">
</div>

<script>
var btn = document.getElementById('myBtn')
var par = document.getElementById('parent');
par.onclick = function(e) {
console.log(e.currentTarget === par);
console.log(e.target === btn);
console.log(this === par);
}
</script>
</body>

2

在事件委托情况下,this,currentTarget相同,都指事件处理程序所绑定的元素,而target指实际中被点击的元素,也就是btn。

总结:this,currentTatget指的是事件处理程序所绑定的元素,target指的时实际点击的目标。
因为在事件委托情况下,事件处理程序绑定在父元素上,所有这三个值会有所不同。

在微信小程序遍历过程中拿不到事件,可参考以下解决方案: - **正确绑定事件和传递数据**:确保在遍历标签时正确绑定事件,并将需要的数据通过 `data-*` 属性传递。例如在遍历标签时,使用 `bindtap` 绑定事件,并通过 `data-*` 传递数据。示例代码如下: ```html <view> <view wx:for="{{tags}}" wx:key="tagId" bindtap="handleTagClick" data-tag="{{item}}"> {{item}} </view> </view> ``` ```javascript Page({ data: { tags: ['标签 1', '标签 2', '标签 3'] }, handleTagClick: function(event) { // event.target.dataset 可以获取到组件上设置的 data-* 属性的 const tag = event.target.dataset.tag; console.log(`点击了标签: ${tag}`); } }) ``` 通过这样的方式,在事件处理函数中就可以通过 `event.target.dataset` 获取到传递的数据 [^1]。 - **检查事件对象的属性**:部分参数可以直接从返回的事件对象中获取,比如 `input` 的 `value`。示例代码如下: ```html <input bindinput="handleBindTap" placeholder="pleaseInput" /> <button>{{text}}</button> ``` ```javascript Page({ data: { text: "" }, handleBindTap(event) { this.setData({ text: event.detail.value }) } }) ``` 在这个例子中,输入框的输入可以通过 `event.detail.value` 获取 [^2]。 - **检查遍历和索引设置**:在使用 `wx:for` 遍历时,确保 `wx:for-index` 和 `wx:for-item` 设置正确,以便正确传递索引和数据。示例代码如下: ```html <view wx:for="{{groupItem}}" wx:key="menuItem" wx:for-index = "index" wx:for-item="menuItem" bindtap="openPart" data-menuItem="{{menuItem}}"> </view> ``` 在事件处理函数中可以通过 `event.currentTarget.dataset` 获取传递的数据 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值