【发布时间】:2019-10-16 21:43:38
【问题描述】:
我有一个元素,我想在用户鼠标移入或移出时更改其 CSS。一些触发它的函数,很简单:
function expandDiv(){
div1.classList.add('expanded')
}
function shrinkDiv(){
div1.classList.remove('expanded')
}
但是,我希望用户在函数实际触发之前快速悬停在(或远离)该元素上(例如 200 毫秒)。这是为了可用性,因为快速通过元素不应触发该功能。这个问题在here 讨论过,我喜欢这个解决方案:
var delay = function (elem, callback) {
var timeout = null;
elem.onmouseover = function() {
// Set timeout to be a timer which will invoke callback after 1s
timeout = setTimeout(callback, 1000);
};
elem.onmouseout = function() {
// Clear any timers set to timeout
clearTimeout(timeout);
}
};
但是当回调函数是我的expandDiv() 或shrinkDiv() 函数时,此解决方案仅在一个方向上有效。我尝试使用delay() 结构简单地编写2 个函数并反转onmouseout 和onmouseenter 事件:
// Delay functions
var delayIn = function (elem, callback) {
var timeout = null;
elem.onmouseover = function() {
// Set timeout to be a timer which will invoke callback after 1s
timeout = setTimeout(callback, 1000);
};
elem.onmouseout = function() {
// Clear any timers set to timeout
clearTimeout(timeout);
}
};
var delayOut = function (elem, callback) {
var timeout = null;
elem.onmouseout = function() {
// Set timeout to be a timer which will invoke callback after 1s
timeout = setTimeout(callback, 200);
};
elem.onmouseover = function() {
// Clear any timers set to timeout
clearTimeout(timeout);
}
};
delayIn(div1, expandDiv);
delayOut(div1, shrinkDiv);
但这不起作用。当 delayIn 和 delayOut 都被调用时,delayIn 函数什么也不做。请参阅此代码笔:
https://codepen.io/slutske22/pen/eYYzQqE?editors=0010
我不确定出了什么问题。 div 应该在鼠标悬停一秒后展开,除非您在第二秒结束之前将鼠标悬停。但它什么也没做。我添加了一个“Expand the Div”按钮来强制它,你可以看到,如果你然后将鼠标悬停在 div 上并鼠标移出,它确实会从 shrinkDiv 函数中缩小,但是没有延迟,因为应该有延迟输出函数。
我也试图将此行为链接到一个按钮。有一个“缩小 div”按钮。期望的行为是您单击按钮,并且在定义的 setTimout 延迟之后 div 将缩小,除非您在超时完成之前鼠标输入 div。这也不会发生。
我觉得这是一个相对简单的任务,但它让我望而却步。我想学习如何在没有 jQuery 的情况下做到这一点。我也意识到这可能应该是this thread 中的一个推荐,但我是新手,还不能发表评论。对不起,如果这是不好的形式。
【问题讨论】:
-
您在
delayIn中分配的onmouse* 处理程序在delayOut中被覆盖
标签: javascript css hover settimeout cleartimeout