e.preventDefault()不是防弹?
我问了一个类似的问题,但没有得到真正令人满意的答案,所以我会在这里再试一次。 当我使用这样的代码时:
$("#element") .on( 'click', function() { // do something } ) .on( 'touchstart', function(e) { e.preventDefault(); // do the same thing but on touch device like iPad fe // and more over PLEASE do not fire the click event also! } );
我期望click事件永远不会永远不会被触发(因为浏览器应该通过事件处理层次结构)但实际上当我触摸元素时,让我们说20次,而不是一次点击事件也会触发。 为什么?
我也尝试过这样的事情:
$("#element") .on( 'click', function() { // do something } ) .on( 'touchstart', function(e) { e.preventDefault(); e.stopPropagation(); // do the same thing but on touch device like iPad fe // and more over PLEASE do not fire the click event also! return false; } );
它似乎更坚固但不防弹。 所以我必须这样做:
$("#element") .on( 'click', function() { if ( !touchdevice ) { // do something }; } ) .on( 'touchstart', function(e) { e.preventDefault(); e.stopPropagation(); // do the same thing but on touch device like iPad fe // and more over PLEASE do not fire the click event also! return false; } );
这似乎有用,但非常愚蠢,不是吗? 有想法的人是什么意思? 谢谢!
编辑:所以我真的不得不这样做:
var touched; $("#element") .on( 'click', function() { if ( !touched ) { // do something }; } ) .on( 'touchstart', function(e) { e.preventDefault(); // actual senseless here e.stopPropagation(); // actual senseless here touched = true; // do the same thing but on touch device like iPad fe // and more over PLEASE do not fire the click event also! return false; // actual senseless here } );
拜托了伙计们! 必须有一种安全的常用方法,可以在同一元素上使用touchstart和click事件,确保不会触发click事件(两次)来处理触摸敏感和常规浏览器(甚至是新的组合浏览器)。 你会怎么做?
我期待click事件永远不会永远不会被触发(因为浏览器应该通过事件处理层次结构)[…]
你对even.preventDefault()
有错误的期望。
event.preventDefault()
可防止浏览器为该元素/事件组合执行的默认操作。 例如,提交表格或以下链接。 它不会阻止执行任何其他事件处理程序。
e.stopPropagation()
可防止事件冒泡,从而不会执行添加到祖先的事件处理程序。
但是,您不能使用任何这些方法来阻止执行不同事件的处理程序,因此设置标志似乎确实是执行此操作的正确方法。
现在我在我的网站上的大多数地方使用以下代码非常好,可靠:
var flag = false; $("#element").on( 'touchstart click', function() { if ( !flag ) { flag = true; setTimeout( function() { flag = false; }, 100 ); // someone else recommended 300 here but I use this value // action here }; return false; } );
PS那不是我的发明,但不幸的是我忘了源头因为时间过去了。