悬停事件
正如我上面提到的,Bootstrap 中的 popover 组件使用的悬停行为不够灵活,无法满足我的需求,但如果你查看 trigger
选项的文档,则 hover
只是其中一个可能的值。 一个引起我注意的是 manual
模式,在这种模式下,可以通过 JavaScript 调用手动显示或删除弹出窗口,这种模式可以让我自由地实现悬停逻辑,所以我将使用该选项并实现我自己的悬停事件处理程序,并以我需要的方式工作。
所以我的下一步是将一个“hover”事件附加到页面中的所有链接。 使用 jQuery,可以通过调用 element.hover(handlerIn, handlerOut)
将悬停事件附加到任何 HTML 元素。 如果在元素集合上调用这个函数,jQuery 方便地将事件附加到所有元素上。 这两个参数是两个函数,分别在用户将鼠标指针移入和移出目标元素时调用对应的函数。
app/templates/base.html :悬停事件。
$(function() {
$('.user_popup').hover(
function(event) {
// mouse in event handler
var elem = event.currentTarget;
},
function(event) {
// mouse out event handler
var elem = event.currentTarget;
}
)
});
事件参数是一个事件对象,它包含了一些有用的信息。 在本处,我使用 event.currentTarget
来提取事件的目标元素。
浏览器在鼠标进入受影响的元素后立即调度悬停事件。 针对弹出行为,你只想鼠标停留在元素上一段时间才能激活,以防当鼠标指针短暂通过元素但不停留在元素上时出现弹出闪烁。 由于该事件不支持延迟,因此这是我需要自己实现的另一件事情。 所以我打算在“鼠标进入”事件处理程序中添加一秒计时器:
app/templates/base.html :悬停延迟。
$(function() {
var timer = null;
$('.user_popup').hover(
function(event) {
// mouse in event handler
var elem = event.currentTarget;
timer = setTimeout(function() {
timer = null;
// popup logic goes here
}, 1000);
},
function(event) {
// mouse out event handler
var elem = event.currentTarget;
if (timer) {
clearTimeout(timer);
timer = null;
}
}
)
});
setTimeout()
函数在浏览器环境中才可用。 它需要两个参数,函数和毫秒单位的时间。 setTimeout()
的效果是函数在给定的延迟后被调用。 所以我添加了一个函数(现在是空的),将在悬停事件的一秒钟后被调用。 由于 JavaScript 语言中的闭包机制,此函数可以访问在外部作用域中定义的变量,例如 elem
。
我将 timer 对象存储在 hover()
调用之外定义的 timer
变量中,以使 timer 对象也可以被“mouse out”处理程序访问。 我需要这么做的原因是为了获得良好的用户体验。 如果用户将鼠标指针移动到其中一个用户链接中,并在移动它之前停留了半秒钟,我不希望该 timer 继续运行并调用显示弹出窗口的函数。 所以我的鼠标移出事件处理程序检查是否有一个活动的 timer 对象,如果有,就取消它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论