进一步改进的解决方案
首先我采用了 Rich Bradshaw 的方法,但随后问题开始出现。通过在 'touchstart' 事件上执行 e.preventDefault(),页面不再滚动,并且长按既不能触发选项菜单也不能双击缩放能够完成执行。
一种解决方案可能是找出正在调用的事件,然后在后面的 'touchend' 中找出 e.preventDefault()。由于滚动的 'touchmove' 出现在 'touchend' 之前,它默认保持不变,并且 'click' 也被阻止,因为它出现在应用到移动端的事件链,如下所示:
// Binding to the '.static_parent' ensuring dynamic ajaxified content
$('.static_parent').on('touchstart touchend', '.link', function (e) {
// If event is 'touchend' then...
if (e.type == 'touchend') {
// Ensuring we event prevent default in all major browsers
e.preventDefault ? e.preventDefault() : e.returnValue = false;
}
// Add class responsible for :hover effect
$(this).toggleClass('hover_effect');
});
但是,当出现选项菜单时,它不再触发'porthend'负责切换课程,然后下次鼠标行为将是另一个方式,完全混合。
然后,一个解决方案将再次有条件地找出我们所处的事件,或者只是做单独的事件,并使用 addClass() 和 removeClass()分别在 'touchstart' 和 'touchend' 上,确保它始终通过分别添加和删除而不是有条件地决定它来开始和结束。最后,我们还将删除回调绑定到 'focusout' 事件类型,负责清除任何可能保持且不再重新访问的链接的悬停类,如下所示:
$('.static_parent').on('touchstart', '.link', function (e) {
$(this).addClass('hover_effect');
});
$('.static_parent').on('touchend focusout', '.link', function (e) {
// Think double click zoom still fails here
e.preventDefault ? e.preventDefault() : e.returnValue = false;
$(this).removeClass('hover_effect');
});
注意:之前的两个解决方案中仍然存在一些错误,并且认为(未测试),双击缩放也仍然失败。
整洁并希望没有错误(不是:))Javascript解决方案
现在,第二次,更清洁、更整洁且响应迅速,只需使用 javascript(.hover 类和伪 :hover 之间没有混合),您可以从那里直接调用您的 ajax 行为通用(移动和桌面)'click' 事件,我找到了a pretty well answered question,从中我终于明白了如何将触摸和鼠标事件混合在一起,而不需要几个事件回调不可避免地改变彼此的事件事件链。方法如下:
$('.static_parent').on('touchstart mouseenter', '.link', function (e) {
$(this).addClass('hover_effect');
});
$('.static_parent').on('mouseleave touchmove click', '.link', function (e) {
$(this).removeClass('hover_effect');
// As it's the chain's last event we only prevent it from making HTTP request
if (e.type == 'click') {
e.preventDefault ? e.preventDefault() : e.returnValue = false;
// Ajax behavior here!
}
});