Touchstart 应该在单击之前发生,因此如果事件是 touchstart 类型,我将删除单击处理程序。这似乎对我的目的很有效:
$('.do-popdown').on('click touchstart', handlePopdown);
function handlePopdown(e){
if(e.type == 'touchstart') {
$('.do-popdown').off('click', handlePopdown).click(function(e){
// do nothing
e.stopPropagation();
e.preventDefault();
return false;
});
}
// do my handling...
// and nothing else:
e.stopPropagation();
e.preventDefault();
return false;
}
e.stopPropagation(); e.preventDefault(); return false; 可能有点矫枉过正,但我将它用于各种不同的元素(<a>、<div>、<span>、<button> 等),这满足了我的日常需求。
编辑:更通用(更好?)的方法是创建类似于熟悉的.click() 事件绑定器的东西:
jQuery.fn.extend({
clickOrTouch: function(handler) {
return this.each(function() {
var event = ('ontouchstart' in document) ? 'touchstart' : 'click';
$(this).on(event, handler);
});
}
});
这样,只有适当的事件附加到选定的元素。
我想一个更“正确”的名称应该是 .touchstartOrClick(),但由于它或多或少是 .click() 的替代品,我决定以 click 开头。
这可以像.click() 一样使用。例如,将 button 放在 div 内并运行:
$('button').clickOrTouch(doSomething);
$('div').clickOrTouch(doSomething);
function doSomething(e) {
$('body').append(this.tagName + ' ' + e.type + '<br>');
e.stopPropagation();
}
这将根据触发方式显示“DIV click”或“BUTTON touchstart”。如果在链接上使用它,请在您的处理程序中添加 e.preventDefault()(如果需要)。