单击事件侦听器和函数上的 JQuery,使用不同的参数以不同的方式触发?

CTOverton

我有一些元素,当我点击它们时,我需要运行一个函数,该函数需要知道点击了什么元素。

示例 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Javascript-触发函数使用反跳机制时删除事件侦听器

重写jquery函数以接受不同的参数?

具有不同触发器元素和侦听器元素的自定义事件

构造函数以不同的传递参数方式调用的区别

单击标签元素内的文本时,Javascript事件侦听器将触发两次

有没有一种方法可以在所有类/对象函数上设置事件,以使侦听器可以接收函数名称和参数?

禁用匿名事件侦听器或将参数和事件传递给非匿名侦听器

jQuery为单击事件的.on侦听器获取子选择器的值

jQuery中的单击事件侦听器

需要2次单击事件侦听器才能由2次不同的单击触发。(JS)

了解不同的事件侦听器方法

jQuery在不同的DOM层次结构中委派的事件侦听器-是否会触发适用的事件侦听器?

单击侦听器从jQuery到Javascript

jQuery事件侦听器多次触发

使用“ this”的javascript函数DOM事件侦听器

Javascript 事件侦听器未触发

如何在事件侦听器中使用 <option> 的值触发函数

JavaScript - 使用带有 setTimeout 函数的事件侦听器

如何使用事件侦听器单击功能使用 javascript 显示和隐藏数组中的图像

创建事件侦听器时,函数会立即触发

函数 onclick 事件侦听器,它使用函数内单击按钮的 id

事件侦听器仅在第二次单击后正确触发

Javascript 单击事件侦听器仅触发一次

侦听器和事件得到错误:函数 App\Events\User\Created::__construct() 的参数太少,

Angular QueryList 返回的类型与来自事件侦听器的单击不同

为什么在单击事件侦听器内触发 click() 不会导致无限循环?

如何在 puppeteer 中使用单击事件侦听器查找元素名称和值

如何使用 jQuery 在类构造函数上添加事件侦听器?

webRTC ondatachannel() 和 onopen() 事件侦听器未触发