我对setTimeout-function有点问题。
$(this)是每个具有特定类的DOM元素。
当鼠标进入elememt,然后离开时,没有问题。但是当鼠标将一个元素直接留给另一个元素(在500毫秒超时内)时,第一个元素(那个,鼠标离开)永远不会淡出。
所以新的mouseenter-Event类阻止了timeOut调用该函数。 没有setTimeout-wrapper,一切正常。
这是我的代码:
$(this).hover(methods['mouseenterManager'], methods['mouseleaveManager']);
/**
* manage mouseenter events
*/
mouseenterManager: function() {
clearTimeout(timer);
//create toolbar, if no toolbar is in dom
if ($(this).data("layouter").toolbar == undefined) {
//get bottom center of this element
pos_left = ($(this).width() / 2) + $(this).offset().left;
pos_top = $(this).height() + $(this).offset().top;
//create toolbar element
toolbar = $('<div style="display:none; left:' + parseInt(pos_left) + 'px; top:' + parseInt(pos_top) + 'px;" class="layouter_bar"><ul><li><a class="edit" href="javascript:;">Edit</a></li><li><a class="copy" href="javascript:;">Edit</a></li><li><a class="remove" href="javascript:;">Edit</a></li></ul></div>');
//bind this element to toolbar
toolbar.data("layouter", {
parent: $(this),
});
//bind toolbar to this element
data = $(this).data("layouter");
data.toolbar = toolbar;
$(this).data("layouter", data);
//bind this element to toolbar
data = toolbar.data("layouter");
data.parent = $(this);
toolbar.data("layouter", data);
element = $(this);
toolbar.mouseleave(function() {
toolbar = $(this);
timer = setTimeout(function() {
if (!toolbar.is(":hover") && !element.is(":hover")) {
toolbar.fadeOut("fast", function() {
$(this).remove();
});
data = element.data("layouter");
data.toolbar = undefined;
element.data("layouter", data);
}
}, 500);
});
//display the toolbar
$("body").append(toolbar);
toolbar.fadeIn("fast");
}
},
/**
* manage mouseleave events
*/
mouseleaveManager: function() {
toolbar = $(this).data("layouter").toolbar;
element = $(this);
if (toolbar != undefined) {
timer = setTimeout(function() {
if (!toolbar.is(":hover")) {
toolbar.fadeOut("fast", function() {
$(this).remove();
});
data = element.data("layouter");
data.toolbar = undefined;
element.data("layouter", data);
}
}, 500);
}
},
};
有什么想法吗?
谢谢你!答案 0 :(得分:0)
将要编辑的元素传递给计时器的功能。
例如:
timer = setTimeout(function(toolbar, element) {
if (!toolbar.is(":hover")) {
toolbar.fadeOut("fast", function() {
toolbar.remove();
});
data = element.data("layouter");
data.toolbar = undefined;
element.data("layouter", data);
}
}, 500)
答案 1 :(得分:0)
在我看来,你正在使用大量的全局变量,当你进入另一个元素时,所有这些全局变量的值都会发生变化。您的超时函数正在引用这些全局变量,因此当它们通过输入另一个元素进行更改时它无法正常工作。
在我看来,只要你输入另一个元素,你清除计时器以防止它运行,因为它是一个全局计时器,只有一个,所以你已经杀死了你想要触发的计时器。 / p>
对于全局变量问题,将var
放在所有应该是本地变量的前面,如下所示:
var toolbar = $(this).data("layouter").toolbar;
var element = $(this);
和
//get bottom center of this element
var pos_left = ($(this).width() / 2) + $(this).offset().left;
var pos_top = $(this).height() + $(this).offset().top;
对于计时器问题,我觉得你需要没有一个全局计时器,但每个元素需要一个计时器。这有点复杂。如果没有我可以运行和测试的东西,我无法确定这是否可以在没有任何其他更改的情况下工作,但这是正确方向的步骤,以将变量修复为本地并使计时器对于每个元素都是本地的:
$(this).hover(methods['mouseenterManager'], methods['mouseleaveManager']);
/**
* manage mouseenter events
*/
mouseenterManager: function() {
var self = $(this);
var timer = self.data("timer");
if (timer) {
clearTimeout(timer);
}
//create toolbar, if no toolbar is in dom
if (self.data("layouter").toolbar == undefined) {
//get bottom center of this element
var pos_left = ($(this).width() / 2) + $(this).offset().left;
var pos_top = $(this).height() + $(this).offset().top;
//create toolbar element
var toolbar = $('<div style="display:none; left:' + parseInt(pos_left) + 'px; top:' + parseInt(pos_top) + 'px;" class="layouter_bar"><ul><li><a class="edit" href="javascript:;">Edit</a></li><li><a class="copy" href="javascript:;">Edit</a></li><li><a class="remove" href="javascript:;">Edit</a></li></ul></div>');
//bind this element to toolbar
toolbar.data("layouter", {
parent: self,
});
//bind toolbar to this element
var data = self.data("layouter");
data.toolbar = toolbar;
self.data("layouter", data);
//bind this element to toolbar
data = toolbar.data("layouter");
data.parent = self;
toolbar.data("layouter", data);
var element = self;
toolbar.mouseleave(function() {
toolbar = self;
timer = setTimeout(function() {
self.data("timer", null);
if (!toolbar.is(":hover") && !element.is(":hover")) {
toolbar.fadeOut("fast", function() {
$(this).remove();
});
data = element.data("layouter");
data.toolbar = undefined;
element.data("layouter", data);
}
}, 500);
self.data("timer", timer);
});
//display the toolbar
$("body").append(toolbar);
toolbar.fadeIn("fast");
}
},
/**
* manage mouseleave events
*/
mouseleaveManager: function() {
var toolbar = $(this).data("layouter").toolbar;
var element = $(this);
var timer = element.data("timer");
if (toolbar != undefined && !timer) {
timer = setTimeout(function() {
element.data("timer", null);
if (!toolbar.is(":hover")) {
toolbar.fadeOut("fast", function() {
$(this).remove();
});
var data = element.data("layouter");
data.toolbar = undefined;
element.data("layouter", data);
}
}, 500);
element.data("timer", timer);
}
},
};