从数组中删除函数

时间:2018-02-11 01:30:09

标签: javascript jquery arrays delegates

我有一系列函数,我试图像c#中的委托事件一样使用。

我将一个函数推送到数组,当数组循环遍历函数时,它将被调用。

问题是我在完成功能后无法删除功能,这种功能会失败。

这是我的代码。我完全有不同的方法来做这件事,我对JS / JQ很新,所以这就是我提出来的。



var MouseMoveFunctions = [];

$(document).ready(function(){
    
    //Create the event to call our functions.
    $(document).mousemove(function(e){
        CallMouseMoveFunctions(e);
    });
   
});

function CallMouseMoveFunctions(e){  
    //Only continue if there is atleast 1 function in the array.
    if(MouseMoveFunctions.length == 0) return;
    
    //Call each function in the array.
    for(var i = 0; i < MouseMoveFunctions.length;i++){
        MouseMoveFunctions[i](e);
    }
}



$(document).ready(function(){
    //Add the TrackMouse function to the array.
    MouseMoveFunctions.push(function(event){TrackMouse(event)});
});




var mX = 0;
var mY = 0;

function TrackMouse(e){
     mX = e.pageX;
     mY = e.pageY;    
    
    var index = MouseMoveFunctions.indexOf(function(event){TrackMouse(event)});
    alert(index); //Always coming up -1, so it isn't getting removed
    
    //Try and remove the function if it exists, just for now so I know its working
    if(index != -1){
    MouseMoveFunctions.splice(index);
    }
    
}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

你需要将1作为第二个参数传递给splice,告诉它删除你作为第一个参数提供的索引位置的1个元素。

.splice(index, 1)

答案 1 :(得分:1)

  

//总是上升-1,所以它不会被删除

您总是得到-1,因为您正在将唯一的函数对象传递给.indexOf(),因此它不能已经在数组中。您推入数组的匿名函数没有其他引用,因此您无法通过引用将其删除。

因为您正在推送和删除一个简单传递事件参数的函数,所以您可以改为推送函数本身。

MouseMoveFunctions.push(TrackMouse);

如果您按身份查找相同的功能,那么您将能够成功找到它。

var index = MouseMoveFunctions.indexOf(TrackMouse);

请注意,如果您将同一个函数多次放入数组中,则每次都需要单独删除它。

此外,正如Scott所说,您需要提供要删除的项目数。

更好的解决方案是使用Set而不是数组。此外,您可以摆脱那些.ready()处理程序。

var MouseMoveFunctions = new Set();

//Create the event to call our functions.
$(document).mousemove(CallMouseMoveFunctions);

function CallMouseMoveFunctions(e){  
    //Only continue if there is atleast 1 function in the array.
    if(MouseMoveFunctions.size == 0) return;

    //Call each function in the set.
    for(const fn of MouseMoveFunctions) {
        fn(e);
    }
}

//Add the TrackMouse function to the array.
MouseMoveFunctions.add(TrackMouse);

var mX = 0;
var mY = 0;

function TrackMouse(e){
     mX = e.pageX;
     mY = e.pageY;    

     MouseMoveFunctions.delete(TrackMouse);
}