我有一些元素,当我点击它们时,我需要运行一个函数,该函数需要知道点击了什么元素。
示例 A:
var elements = $(".config-cell");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", function() {
console.log("clicked");
});
}
在那里调用函数时它工作正常,但是我不知道如何将元素传递给函数以便它可以使用它。
所以我尝试使用这种方法并发现了一些奇怪的东西。
示例 B:
var elements = $(".config-cell");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", this.cellCrop());
}
当我简单地调用位于别处的函数时,我注意到在加载窗口时它会自动触发该函数,然后它甚至不添加事件侦听器,因此在您单击之后什么都没有发生。
底线我希望能够通过当前被点击的元素并让它触发一个函数。但出于好奇,我想知道为什么方法 B 的工作方式如此。
了解到它知道使用哪个,因为“forEach”有一个带参数的回调
.forEach(function callback(currentValue[, index[, array]])
例如:这个回调如何知道应该是'eachName'和'index'
var friends = ["Mike", "Stacy", "Andy", "Rick"]; friends.forEach(function (eachName, index){ console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick });
你能用 .addEventListener 而不是将它设置为 var 来做到这一点吗?
话虽如此,有没有办法让它用你自己的函数传递变量?喜欢:
var passthrough = 5;
$(".config-cell").on("click", function(passthrough) {
var five = passthrough;
console.log(five);
});
首先,this.cellCrop()
调用函数,this.cellCrop
传递它。所以如果你想设置监听器,那就是
elements[i].addEventListener("click", this.cellCrop);
现在要在函数内实际点击元素,您可以通过几种方式来实现。
使用来自自动传递给事件侦听器的事件对象的currentTarget / target
elements[i].addEventListener("click", function(event){
//the actual element clicked on
var target = event.target;
//the element the event was set on, in this case whatever elements[i] was
var currentTarget = event.currentTarget;
});
//same using jQuery
$(elements[i]).click(function(event){
var target = event.target;
var currentTarget = event.currentTarget;
});
使用this
关键字
elements[i].addEventListener("click", function(event){
//this will refer to whatever elements[i] was
var target = this;
});
//same using jQuery
$(elements[i]).click(function(event){
var target = $(this);
});
这将适用于使用对象方法:
obj = {
cellCrop:function(event){
var target = event.target;
/* etc */
},
someOtherMethod:function(){
//...
elements[i].addEventListener("click",this.cellCrop);
//or jQuery
$(elements[i]).click(this.cellCrop);
//...
}
};
obj.someOtherMethod();
这个回调如何知道应该是'eachName'和'index'
因为该forEach
方法的文档告诉使用它的人将如何调用它。因此,您可以根据该文档编写回调。
例如,回调forEach
通常采用以下形式
function callback(currentValue[, index[, array]])
这意味着forEach()
它内部将以这种方式调用您的回调
function forEach(callback){
//`this` inside forEach is the array
for(let i=0; i<this.length; i++){
callback(this[i], i, this);
}
}
至于向函数传递任意数据,有几种方法可以做到:
在匿名函数中包装对函数的调用,并使用更多参数显式调用该函数
obj = {
cellProp:function(event,a,b,c){
var element = event.currentTarget;
}
}
//normal anonymous function
elements[i].addEventListener('click',function(e){
obj.cellProp(e,1,2,3);
});
//fat arrow function
elements[i].addEventListener('click',e=>obj.cellProp(e,1,2,3))
在上面的 a、b 和 c 将分别包含值 1,2 和 3
您还可以使用诸如bind 之类的方法来更改函数的thisArg
(请参阅此问题以了解更多信息),但也可以将参数传递给函数
obj = {
//note event comes last as bind, call, and apply PREPEND arguments to the call
cellProp:function(a,b,c,event){
//`this` will change depending on the first
//argument passed to bind
var whatIsThis = this;
var element = event.target;
}
}
//passing obj as the first argument makes `this` refer to
//obj within the function, all other arguments are PREPENDED
//so a,b, and c again will contain 1,2 and 3 respectively.
elements[i].addEventListener('click', obj.cellProp.bind(obj,1,2,3) );
在 jQuery 的情况下,您还可以在设置事件时使用对象传递数据:
obj = {
cellProp:function(event){
var data = event.data;
console.log(data.five);
}
}
jQuery(elements[i]).click({five:5},this.cellProp);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句