我如何处理(好吧,模拟)触摸设备上的悬停行为
How do I handle (well, mock) hover behaviour on a touch device?
我想解决一个网站在触摸设备上的问题。在桌面上,有一行导航链接,悬停时每个链接都会弹出自己的弹出按钮。然而,在触摸设备上,没有悬停事件,所以我正在寻找最好的方式来嘲笑它。
我希望在触摸设备上实现的行为如下:
- 用户在菜单项上点击一次,弹出按钮就会显示出来
- 然后,用户可以点击弹出按钮中的链接,如果他们愿意或
- 用户可以再次点击菜单项,然后按照该页面的链接进行操作
- 用户可以点击页面上的任何其他位置(或滚动),弹出按钮就会关闭
我最初尝试使用类似的东西:
$('nav-item').on(‘touchstart’, function() {
...
});
触发这些弹出按钮的显示,它似乎起到了作用,但我无法完全正确地关闭这些按钮。我对此做了一些研究,其他一些人正在做一些事情,比如:
$(‘html’).on(‘touchstart’, function() {
...
});
以监听页面上任何位置的触摸,然后强制关闭当前打开的弹出按钮。然而,这似乎有点粗糙,意味着如果用户触摸弹出按钮本身的某个地方,弹出按钮就会关闭,这是不可取的。在这里使用jQuery的not
选择器并排除可以触摸以关闭弹出按钮的区域的所有弹出按钮会更好吗?或者有更好的方法来处理这一问题吗?我试图实现的一个很好的例子是亚马逊如何在主导航的右侧处理弹出按钮。点击一次以打开,再次点击以跟随链接,或点击/滚动其他任何位置以关闭弹出按钮。我正在努力彻底重构这些弹出按钮的处理方式,以便从一开始就考虑移动/触摸,但至少目前,我想找到一种实现上述目标的方法。
提前谢谢。
您可以将touchstart事件放在document、html或body上,然后检查被触摸的目标DOM元素是弹出按钮还是它的子元素。如果没有,请关闭:
$(document).on('touchstart', function (e) {
if ($(e.target).closest("#CONTAINER").length === 0) {
$("#CONTAINER").hide();
}
});
在这个例子中,我使用的是jQueryclosest()函数,它似乎非常适合这种情况。
相关文章:
- 我如何处理(好吧,模拟)触摸设备上的悬停行为
- 点击悬停区域中的链接会在触摸时立即激活
- 当鼠标也在触摸另一个元素时,d3.js鼠标悬停事件未被触发
- 取消触摸设备上的模拟悬停事件/颜色
- 删除触摸设备 CSS 上的悬停效果
- 使用鼠标悬停打开/关闭导航,在移动设备上触摸
- 在触摸设备上的悬停状态后启用链接,而不会影响正常滚动
- 离子/角度在触摸/单击时悬停
- AngularJS 事件,用于触摸等效于鼠标悬停
- 如何用Javascript检测触摸悬停
- JQuery悬停、点击和触摸组合
- 如何防止我的触摸设备执行::悬停而不是单击功能
- Don't在触摸设备上显示悬停状态
- 如何防止触摸设备上按钮的粘滞悬停效果
- 忽略触摸设备上的jQuery悬停(mouseenter, mouseleave)
- 防止:在iOS中鼠标悬停在触摸上
- 在jQueryMobile中,鼠标悬停效果在触摸后保持不变
- 防止超链接的触摸和显示悬停状态
- 当用户触摸滑动导航元素时的悬停效果
- 如何识别鼠标悬停事件对象是否来自触摸屏触摸