我是ES6的新手,并且无法完成这项工作:
$(this)
在点击时返回undefined?
dom.videoLinks.click((e) => {
e.preventDefault();
console.log($(this));
var self = $(this),
url = self.attr(configuration.attribute);
eventHandlers.showVideo(url);
// Deactivate any active video thumbs
dom.videoLinks.filter('.video-selected').removeClass('video-selected');
// Activate selected video thumb
self.addClass('video-selected');
});
但是如果我改变它而不是像这样的箭头功能,它会按预期工作吗?:
dom.videoLinks.click(function(e) {
e.preventDefault();
console.log(this);
console.log($(this));
var self = e.this,
url = self.attr(configuration.attribute);
eventHandlers.showVideo(url);
// Deactivate any active video thumbs
dom.videoLinks.filter('.video-selected').removeClass('video-selected');
// Activate selected video thumb
self.addClass('video-selected');
});
那么如果我在回调中使用箭头功能,我该怎么办呢?
答案 0 :(得分:25)
使用箭头功能作为回调,而不是使用this
来获取处理程序绑定的元素,您应该使用event.currentTarget
。
箭头函数中this
的值取决于箭头函数定义的位置,而不是使用的位置。
从现在开始,请记住
event.currentTarget
始终引用当前正在处理其EventListeners的 DOM
元素。
因为事件冒泡/捕获而使用event.currentTarget
代替event.target
:
event.currentTarget
- 是附加了事件侦听器的元素。event.target
- 是触发事件的元素。<强> From the documentation: 强>
类型为currentTarget
的
EventTarget
,readonly用于表示 目前正在处理EventTarget
的{{1}}。这个 在捕获和冒泡期间特别有用。
检查 以下代码段中的基本示例
EventListeners
var parent = document.getElementById('parent');
parent.addEventListener('click', function(e) {
document.getElementById('msg').innerHTML = "this: " + this.id +
"<br> currentTarget: " + e.currentTarget.id +
"<br>target: " + e.target.id;
});
$('#parent').on('click', function(e) {
$('#jQmsg').html("*jQuery<br>this: " + $(this).prop('id')
+ "<br>currenTarget: " + $(e.currentTarget).prop('id')
+ "<br>target: " + $(e.target).prop('id'));
});
$('#parent').on('click', e => $('#arrmsg').html('*Arrow function <br> currentTarget: ' + e.currentTarget.id));
#parent {background-color:red; width:250px; height:220px;}
#child {background-color:yellow;height:120px;width:120px;margin:0 auto;}
#grand-child {background-color:blue;height:50px;width:50px;margin:0 auto;}
#msg, #jQmsg, #arrmsg {font-size:16px;font-weight:600;background-color:#eee;font-family:sans-serif;color:navy;}
答案 1 :(得分:7)
你不会。
更改{{1}}的值是使用箭头功能的主要目的。
如果您不想这样做,那么箭头功能是错误的工具。
答案 2 :(得分:3)
即使在箭头功能内,您也可以使用&debugQuery=true&enableElevation=true&debug.explain.structured=true
代替$(event.target)
。箭头函数保留了定义它们的范围的$(this)
。在您的情况下,它是this
。
答案 3 :(得分:2)
箭头功能和这个选择器?
箭头函数保留this
来封闭上下文。
例如
obj.method = function(){
console.log(this);
$('a').click(e=>{
console.log(this);
})
};
obj.method(); // logs obj
$('a').click(); // logs obj
那么如果我在回调中使用箭头函数,我该怎么办呢?
您已经可以 - 访问事件目标,您可以使用类似$(e.target)
的内容,但要小心冒泡。所以我建议使用普通函数作为回调。