这是ariutta/svg-pan-zoom的一个特定于库的问题。
我有一个带有一些<a>
标签的 SVG 元素。通过 jQuery,我处理对这些元素的点击:$('svg').on('click', 'a', function() { ... })
.
现在我添加了上面提到的用于缩放和平移 SVG 元素的库。这很好用,除了每次我在光标位于a
元素上时平移时,它都会触发点击侦听器。
当 mouseup 由 pan 引起时,如何防止监听器触发?
这是ariutta/svg-pan-zoom的一个特定于库的问题。
我有一个带有一些<a>
标签的 SVG 元素。通过 jQuery,我处理对这些元素的点击:$('svg').on('click', 'a', function() { ... })
.
现在我添加了上面提到的用于缩放和平移 SVG 元素的库。这很好用,除了每次我在光标位于a
元素上时平移时,它都会触发点击侦听器。
当 mouseup 由 pan 引起时,如何防止监听器触发?
对你来说可能为时已晚,不过,我想分享我的解决方案:
我使用 beforePan 设置一个属性,该点击当前被禁用。
在单击事件处理程序中,我检查属性,如果单击当前被禁用。如果是这样,请不要执行任何操作,而是将属性设置回来。下一次,点击事件处理程序被调用,当你真正点击时,点击动作正常执行。
beforePan: function(oldPan, newPan) {
svgPolygons.clickDisabled = true;
},
function clickerHandler() {
if (!svgPolygons.clickDisabled) {
// perform click action
} else {
// enable click again
svgPolygons.clickDisabled = false;
}
}
在上面的代码中,svgPolygons 是我用来存储属性的 SVG 中的一个元素。但是,当然,如果当前禁用单击,则可以使用任何其他位置进行存储。
您可以尝试将自定义事件处理程序添加到 svgPanZoom,就像在自定义事件处理程序示例中一样
你应该挂钩mousedown
,mousemove
和mouseup
事件。事情的顺序应该是这样的:
mousedown
设置一个可能发生点击的标志(例如willClick = true
)mousemove
禁用 jquery 侦听器并将您的标志设置为 falsemouseup
标志是否为假并启用jquery侦听器这样会有2个场景:
mousedown
被解雇mouseup
被解雇click
被解雇mousedown
被解雇mousemove
被触发并且监听器被禁用(可能多次)mouseup
被触发并重新启用侦听器现在我不确定防止点击是否真的有效,因为它取决于事件的顺序以及 jQuery 如何在内部存储事件历史记录(如果这样做的话)。
另一种方法是wasPanned
在mousemove
事件和 jquery 回调内部设置一个全局标志,以检查该标志并重置它。