通行证;";添加到一个新函数-javascript

通行证;";添加到一个新函数-javascript,javascript,javascript-events,Javascript,Javascript Events,我有一个函数,它等待img上的单击事件,然后启动imgclick() 这一切都按预期工作,但一旦进入函数,我需要使用e.preventDefault(),它会失败,因为“e”不可用。我想我可以通过传递字面上的e来纠正这个问题,但这也不好。我应该如何正确访问它?下面是我目前的JS var img = document.getElementsByClassName("img"), i; function imgclick(id, e) { e.preventDefault(); e

我有一个函数,它等待img上的单击事件,然后启动imgclick()

这一切都按预期工作,但一旦进入函数,我需要使用e.preventDefault(),它会失败,因为“e”不可用。我想我可以通过传递字面上的e来纠正这个问题,但这也不好。我应该如何正确访问它?下面是我目前的JS

var img = document.getElementsByClassName("img"),
    i;

function imgclick(id, e) {
  e.preventDefault();
  e.stopPropagation();
}

for (i = 0; i < img.length; i++) {
  img[i].addEventListener("click", imgclick(this.id, e));
}
var img=document.getElementsByClassName(“img”),
我
函数imgclick(id,e){
e、 预防默认值();
e、 停止传播();
}
对于(i=0;i

我仍然掌握着不依赖jQuery的诀窍,如果这是一个非常明显的错误,那么很抱歉

首先:当添加
事件监听器时,您需要引用
回调函数
,而不是调用它。
其次:
事件
,或者
e
参数应该是
回调函数的第一个参数,在那里,您可以使用
this.id
获取
id
,或者使用
e.target.id

var img = document.getElementsByClassName("img"),
    i;

function imgclick(e) {
  e.preventDefault();
  e.stopPropagation();
  var id=this.id;  //e.target.id     
 }

for (i = 0; i < img.length; i++) {
  img[i].addEventListener("click", imgclick);
 }
var img=document.getElementsByClassName(“img”),
我
函数imgclick(e){
e、 预防默认值();
e、 停止传播();
var id=this.id;//e.target.id
}
对于(i=0;i
您需要为
addEventListener
提供一个函数,该函数只接受一个参数(事件:
e
),然后将该
事件
传递给
imgclick
函数

如果您只能针对支持ES2015 arrow功能的浏览器,则只需使用:

img[i].addEventListener("click", e => imgclick(this.id, e));
或对于任何ES5+环境:

img[i].addEventListener("click", function(e) { imgclick(this.id, e) }.bind(this));
var _this = this;
img[i].addEventListener("click", function(e) { imgclick(_this.id, e) });
或者对于任何JavaScript环境:

img[i].addEventListener("click", function(e) { imgclick(this.id, e) }.bind(this));
var _this = this;
img[i].addEventListener("click", function(e) { imgclick(_this.id, e) });
如果您不需要访问此
,只需

function(e) { imgclick(somethingElse.id, e) }

作为第二个参数。

如其他人所述,
imgclick(this.id,e)
实际上调用处理程序函数,而不是等待用户单击
img
。例如,您可以使用附件并为每个元素创建一个新的处理程序。以下是基于您的代码的JSFIDLE: