正在检测智能手机浏览器上的悬停或鼠标悬停
Detecting hover or mouseover on smartphone browser
我的应用程序中有一个字母滚动条(ASB),大多数智能手机的Contacts
应用程序中都有。
现在,当我的手指touchstart touchend click etc..
在ASB上时,我滚动到特定项目没有问题。但是,我在智能手机上捕捉hover
或mouseover
事件时遇到了问题。
我试过touchstart touchswipe touchend mouseenter mousemove
或hover
,但没有运气。
这是Fiddle或Codepen,可以在手机上玩。
欢迎提出任何建议。
TL;DR;CCD_ 7、CCD_ 8和CCD_。
我发现人们一直告诉我,在非本地应用程序上不可能在智能手机上提供悬停事件的功能。
但是,现代智能手机浏览器实际上已经提供了这些功能。我意识到,解决方案实际上就在一个非常简单的地方。经过一些调整,我已经想好了如何模拟这种行为来跨平台,即使这有点作弊。
因此,大多数touchevents
都在传递参数,这些参数具有用户在屏幕上触摸的所需信息。
E.g
var touch = event.originalEvent.changedTouches[0];
var clientY = touch.clientY;
var screenY = touch.screenY;
既然我知道ASB
上每个按钮的高度,我就可以计算出用户将元素悬停在哪里
下面是CodePen,可以在移动触摸设备上轻松尝试(请注意,这只适用于触摸设备,您仍然可以在切换设备模式下使用chrome)
这是我的最后一个代码,
var $startElem, startY;
function updateInfo(char) {
$('#info').html('Hover is now on "' + char + '"');
}
$(function() {
var strArr = "#abcdefghijklmnopqrstuvwxyz".split('');
for (var i = 0; i < strArr.length; i++) {
var $btn = $('<a />').attr({
'href': '#',
'class': 'btn btn-xs'
})
.text(strArr[i].toUpperCase())
.on('touchstart', function(ev) {
$startElem = $(this);
var touch = ev.originalEvent.changedTouches[0];
startY = touch.clientY;
updateInfo($(this).text());
})
.on('touchend', function(ev) {
$startElem = null;
startY = null;
})
.on('touchmove', function(ev) {
var touch = ev.originalEvent.changedTouches[0];
var clientY = touch.clientY;
if ($startElem && startY) {
var totalVerticalOffset = clientY - startY;
var indexOffset = Math.floor(totalVerticalOffset / 22); // '22' is each button's height.
if (indexOffset > 0) {
$currentBtn = $startElem.nextAll().slice(indexOffset - 1, indexOffset);
if ($currentBtn.text()) {
updateInfo($currentBtn.text());
}
} else {
$currentBtn = $startElem.prevAll().slice(indexOffset - 1, indexOffset);
if ($currentBtn.text()) {
updateInfo($currentBtn.text());
}
}
}
});
$('#asb').append($btn);
}
});
#info {
border: 1px solid #adadad;
position: fixed;
padding: 20px;
top: 20px;
right: 20px;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="info">
No hover detected
</div>
<div id="asb" class="btn-group-vertical">
</div>
悬停事件是由手机上的点击/触摸事件触发的,因为你不能简单地将元素悬停在触摸屏上。
您可以通过简单地使用css悬停和/或焦点选择器来修改内容来演示这种行为,您可以看到,在单击之前,元素保持不变,但在单击之后,它们保留了修改后的样式。
在父级上绑定touchstart。这样的东西会起作用:
$('body').bind('touchstart', function() {});
你不需要在函数中做任何事情,把它留空。这将足以在触摸时获得悬停,因此触摸的行为更像:悬停,而不像:活动。
类似的问题我如何在支持触摸的浏览器中模拟触摸悬停?
您在Fiddle或Codepen中提供的代码运行良好。那有什么大惊小怪的?
好吧,在智能手机和平板电脑等主要是空气或触摸触发的小工具中,你不能简单地使用悬停功能,因为你不能将东西悬停在上面来进行一些活动。例如,当你使用平板电脑的可拆卸键盘(或使用鼠标或手指滚动器的东西)时,你只能使用悬停功能。
- 当鼠标悬停在文本中的单词上时显示警报
- d3.js鼠标悬停鼠标输出问题
- 悬停(鼠标离开)方法不显示效果
- 为什么addEventListener只执行我的函数,而不为其创建鼠标悬停/鼠标打开事件
- 在鼠标悬停/鼠标出类中的任何元素时更改元素 ID
- 检测鼠标悬停/鼠标单击,无论 Z 顺序/图层级别如何
- 悬停/鼠标悬停功能冲突
- 子元素的 JavaScript 鼠标悬停/鼠标退出问题
- 在 iPad 上触发悬停/鼠标退出/模糊
- 如何通过按钮单击和鼠标悬停/鼠标退出显示和隐藏节点文本?D3/JS.
- 背景图像在悬停/鼠标悬停时消失,菜单在IE中不起作用
- jQuery鼠标悬停/鼠标悬停将不适用于Live
- jQuery-悬停以在刷新时触发悬停/鼠标悬停
- 悬停/鼠标悬停未在元素内部的每次移动中激活
- HighCharts条形图:悬停鼠标时显示条形值
- 鼠标悬停/鼠标离开,鼠标进入/鼠标离开,鼠标悬停闪烁问题
- 滚动时未触发鼠标悬停/鼠标输入
- JavaScript-如何在鼠标悬停/鼠标悬停上同时更改TR中所有TD的背景颜色
- 记住并在悬停鼠标悬停后显示以前活动的导航选项卡
- JavaScript延迟CSS悬停/鼠标悬停效果