Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 辨别触摸操作导致的上下文菜单事件?_Javascript_Html_Touch_Contextmenu_Dom Events - Fatal编程技术网

Javascript 辨别触摸操作导致的上下文菜单事件?

Javascript 辨别触摸操作导致的上下文菜单事件?,javascript,html,touch,contextmenu,dom-events,Javascript,Html,Touch,Contextmenu,Dom Events,我有一个应用程序,其中SVG元素中的元素可以拖放(感谢和,请参见此类页面的示例),也可以在支持触摸的设备上使用,但长按后会弹出一个上下文菜单(至少在IE11、Edge和Firefox中是这样),并且会碍事,因此,我想防止上下文菜单在这种情况下显示 我可以通过处理contextmenu事件并执行.preventDefault()来禁止显示上下文菜单在事件对象上,但我想知道是否存在这样一种解决方案,即在触摸屏中上下文菜单被阻止显示,并且它仍然会显示,例如,右键单击或在元素有焦点时按下 起初我认为我可

我有一个应用程序,其中SVG元素中的元素可以拖放(感谢和,请参见此类页面的示例),也可以在支持触摸的设备上使用,但长按后会弹出一个上下文菜单(至少在IE11、Edge和Firefox中是这样),并且会碍事,因此,我想防止上下文菜单在这种情况下显示

我可以通过处理
contextmenu
事件并执行
.preventDefault()来禁止显示上下文菜单
在事件对象上,但我想知道是否存在这样一种解决方案,即在触摸屏中上下文菜单被阻止显示,并且它仍然会显示,例如,右键单击或在元素有焦点时按下

起初我认为我可以查看事件对象的
.button
.button
属性,但这些值似乎是任意的
0
2
,在不同系统的不同浏览器中进行测试时,似乎可以在任意组合中找到

元素已具有
触摸操作:无

是否有一些有效的方法使上下文菜单不会因长按而显示?


jQuery UI Touch Punch解决了所有问题

它是对jQueryUI的触摸事件支持。基本上,它只是将触摸事件连接回jQueryUI。在iPad、iPhone、Android和其他支持触摸的移动设备上进行测试。我使用了jQueryUISortable,它工作起来很有魅力


在我的例子中,
d3
已经在为我处理所有的触摸事件,所以我不想要另一个库。我正在寻找一个低级解决方案。如果它能在(所有浏览器/操作系统组合中)工作,那么它可能也能在我的应用程序中工作。我想你可以重新打开触摸操作,并使用
touchmove
touchend
事件来确定是否打开contextMenu。例如:在
touchmove
上,您可以设置一个标志,长按应该被忽略。然后在
touchend
上,您可以关闭该标志。在
contextmenu
事件处理程序中,只需检查标志。这有意义吗?@Potter听起来很有希望,但我必须详细尝试一下,例如,是否存在任何种族条件,例如,
contextmenu
事件是否真正只在所有浏览器和平台上的相关触摸事件之后触发。我刚刚了解到,即使在鼠标的情况下,也存在一些差异,在某些系统上,是按下鼠标右键触发上下文菜单,而在其他系统上则是释放,从理论上讲,我可能会与使用敞篷车的用户打交道,因此会把事情搞混,但我想这是一个非常边缘的情况,不值得担心。我开始认为,也许只是阻止所有
contextmenu
事件并没有那么糟糕,毕竟,你的普通用户并没有太多地使用它,如果只是在我想我可以再次允许的链接上使用它的话。丢失的是一些功能,例如,在Edge中,您可以右键单击SVG(即使是动态生成的SVG)并下载它,但在我的例子中,它无论如何都会损坏(因为CSS和ext.refs)。