Javascript removeEventListener无法正常工作
我已经编写了以下函数,它添加了一个事件侦听器并注册了事件。假设Javascript removeEventListener无法正常工作,javascript,javascript-events,addeventlistener,Javascript,Javascript Events,Addeventlistener,我已经编写了以下函数,它添加了一个事件侦听器并注册了事件。假设this.$target保存目标元素的元素id(例如:如果我们在div上添加事件侦听器,并且id='myDiv',那么this.$target将是myDiv)和this.$指向目标元素(例如:this.$\ux=document.getElementById('myDiv')) 事件以以下方式注册。。。 元素的每种类型的事件侦听器都有一个数组。例如:myDiv\u click将在具有id=myDiv…的div上保留所有click事件侦
this.$target
保存目标元素的元素id
(例如:如果我们在div
上添加事件侦听器,并且id='myDiv'
,那么this.$target
将是myDiv)和this.$
指向目标元素(例如:this.$\ux=document.getElementById('myDiv')
)
事件以以下方式注册。。。
元素的每种类型的事件侦听器都有一个数组。例如:myDiv\u click
将在具有id=myDiv…的div上保留所有click事件侦听器。几乎myDiv\u mouseover
将在元素的事件处理程序上保留所有鼠标。对应于每个事件,函数返回一个事件id
。其格式为数组中的eventType\u
。。例如:元素上的第一次鼠标单击事件将具有事件idclick\u 0
这个很好用
现在,我编写了一个用于删除eventlistener的函数。函数将$hear()
返回的eventId
作为参数…但在执行后,事件不会被删除..函数如下..其中有什么错误
main.prototype.$hear = function(ev,callbackF,order)
{
if(typeof order == 'undefined' || order =='' )
order = 0;
order = (order == 1)?true:false;
var a;
if(!(a = (this[this.$target+ev])))//event registration
a = ((this[this.$target+ev]) = new Array());
a.push(callbackF+"_"+order);
this.$_.addEventListener(ev,callbackF,order);
return ev+"_"+(a.length - 1);//event Id
}
main.prototype.$miss = function(evId)
{
var ev = evId.split("_");
var evIndex = ev[1];
ev = ev[0];
evId = ev;
if((!(ev = (this[this.$target+ev]))) || ev.length-1<evIndex||evIndex<0)
{
alert("ERROR \n\n\n Event having event id "+evId+" is not registered\n");
return false;
}
else
{
var temp = evIndex;
evIndex = ev[evIndex].split("_") ;
this.$_.removeEventListener(evId,evIndex[0],evIndex[1]);
ev.splice(temp,1);
}
}
main.prototype.$hear=function(ev、callback、order)
{
如果(订单类型=='未定义'| |订单=='')
顺序=0;
顺序=(顺序==1)?真:假;
var a;
if(!(a=(this[this.$target+ev])//事件注册
a=((this[this.$target+ev])=新数组();
a、 推送(回拨+命令);
此.$\添加了EventListener(ev、Callback、order);
返回ev+“”+(a.length-1);//事件Id
}
main.prototype.$miss=function(evId)
{
var ev=期初拆分(“”);
var evIndex=ev[1];
ev=ev[0];
evId=ev;
如果(!(ev=(this[this.$target+ev]))| ev.length-1您需要将完全相同的参数传递给removeEventListener
就像EventListener
一样。这样就足够了callback
和order
你没有这样做
你可能是说
evIndex = a[evIndex].split("_");
而不是
evIndex = ev[evIndex].split("_");
并希望a
成为全球性的
但问题仍然是,您希望从字符串
获取原始的函数
你需要重新思考和重新设计你的代码
只需推送:
{
'event_name' : ev,
'callback' : callbackF,
'order' : order
}
进入a
而不是连接的字符串。看起来evIndex[0]
是要发送到removeEventListener的字符串,而不是要删除的函数的引用
我想你需要这样的东西:
this.$\u.removeEventListener(evId、callbackF、evIndex[1]);
我意识到字符串evIndex[0]包含函数的名称,但是removeEventListener
需要实际引用它,而不仅仅是字符串中的名称。函数scalewo(影响事件){
function scaleTwo(influenceEvent){
var slideshow=document.getElementById("step3");
if(influenceEvent){
if (slideshow.attachEvent){
slideshow.attachEvent("on"+mousewheelevt, rotateimage)
} else if (slideshow.addEventListener) {
slideshow.addEventListener(mousewheelevt, rotateimage, false)
}
} else{
if (slideshow.attachEvent) {
slideshow.detachEvent("on"+mousewheelevt, rotateimage);
} else if (slideshow.addEventListener) {
slideshow.removeEventListener(mousewheelevt, rotateimage, false);
}
}
}
var influenceEvent = 0;
$(window).scroll(function(event){
if (($(document).scrollTop() > $('#step1').height()*2) && $(document).scrollTop() < $('#step1').height()*3) {
if(flagScrollTwo) {
scaleTwo(1);
influenceEvent = 1;
}
flagScrollTwo = 0;
}
if (($(document).scrollTop() > $('#step1').height()*3) || $(document).scrollTop() < $('#step1').height()*2) {
if(influenceEvent){
scaleTwo(0);
influenceEvent = 0;
}
}
}
var slideshow=document.getElementById(“step3”);
如果(影响事件){
if(slideshow.attachEvent){
幻灯片。附件(“在”+鼠标滚轮上,旋转图像)
}else if(幻灯片放映。addEventListener){
幻灯片放映。添加视频列表(mousewheelevt、rotateimage、false)
}
}否则{
如果(幻灯片,附件){
slideshow.detachEvent(“在”+mousewheelevt上,旋转图像);
}else if(幻灯片放映。addEventListener){
slideshow.removeEventListener(mousewheelevt,rotateimage,false);
}
}
}
var-influenceEvent=0;
$(窗口)。滚动(功能(事件){
如果($(文档).scrollTop()>$('#step1').height()*2)和&$(文档).scrollTop()<$('#step1').height()*3){
如果(两个){
scalewo(1);
影响事件=1;
}
2=0;
}
如果($(文档).scrollTop()>$('#step1').height()*3)| |$(文档).scrollTop()<$('#step1').height()*2){
如果(影响事件){
scalewo(0);
影响事件=0;
}
}
}
a.push(callbackF+“”+order)与a.push(callbackF)相比,a.push(callbackF)与$miss中相应的retreval足够了吗?@JinuJD更好地推送包含所有所需数据的对象,请参阅我的答案。是的,这样做可以,但是@Krizz对他们的答案进行编辑是一个更好的解决方案。