我有一系列函数,我试图像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;
答案 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);
}