我有一个简单的SVG圆形,我想拖动它:
<svg version="1.1" viewBox="0 0 640 480" id="svg" style="width: 640px; height: 480px; top:0px; left: 0px; position: absolute;">
<circle class="selhan" cx="320" cy="240" r="200" id="circ"
style="fill: none; stroke: rgb(0, 0, 0); pointer-events: all;
touch-action: none; user-select: none; -webkit-user-drag: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
</circle>
</svg>
我正在设置一个简单的pan
处理程序:
var circ = document.getElementById("circ")
var Hn1=new Hammer(circ, {/*domEvents:true*/})
Hn1.add( new Hammer.Pan({ direction: Hammer.DIRECTION_ALL, threshold: 0, pointers:1 }) )
var X0,Y0
Hn1.on("panstart", function(e) {
var ob = e.target
var cx = ob.getAttribute("cx")
var cy = ob.getAttribute("cy")
X0=e.center.x-cx
Y0=e.center.y-cy
})
Hn1.on("pan", function(e) {
var ob = e.target
var X = e.center.x-X0
var Y = e.center.y-Y0
ob.setAttribute("cx",X)
ob.setAttribute("cy",Y)
})
我已经创建了一个Fiddle来进行演示。在移动设备上,如果我将手指放在圆形的中心并缓慢移动,我会看到圆形轨迹短暂出现,但随后中心突然跳转到0,0,而在桌面上,它一直跟随指针移动。
我创建了一个更新的Fiddle,用于显示panstart
、pancancel
和panend
事件发生时的情况。我所看到的是,当圆形跳转到原点时,我会收到一个pancancel
事件。为什么我的pan操作会被取消,即使我没有从屏幕上抬起手指?
更奇怪的是this version。我所做的只是颠倒了跟踪好吧,事实证明滚动的是元素而不是圆形。但是,在桌面上,版本41也表现得很奇怪……当我第一次尝试时,它根本不响应鼠标事件,但后来它开始工作,然后又停止了,只是通过切换到不同的版本再切换回来就能实现。panstart
、pancancel
和panend
次数的悬挂标签的顺序。如果标签在SVG之后,则突然间我可以移动圆形,但仅限水平移动。但是,如果标签在SVG之前或不存在,则在短时间内指尖移动后,移动操作会突然取消。
这仍然不太合理-即使我以足够快的速度移动,我也会看到这种情况发生,我不希望这成为问题,即使我移动得很慢。
更新2: 我添加了以下检测:
Hn1.on("hammer.input",function(ev) {
console.log("debug",ev)
})
当我这样做时,我看到一个源事件
pointercancel
,这表明浏览器正在取消指针运动,而实际上它正在被使用中。在查看文档的过程中,没有提到任何指针事件被取消的四个原因适用于这种情况。这是怎么回事?!