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