我使用这个很棒的插件和 jquery.draggable 来平移/缩放带有可拖动节点的图表,
但是在最新的 Chrome 更新节点之后变得不可拖动。
很少有调查显示 Chrome 通过其指针下降事件改变了一些东西,
所以现在 panzoom 插件在触发 mousedown 事件之前响应子节点的 pointerdown 事件。
Panzoom 会抑制 pointerdown 事件,并且由于某种原因之后没有 mousedown 事件,因此不会开始拖动。
jquery.panzoom.js v3.2.2
jquery 3.1.0 或 v1.11.3
jqueryui 1.12.0 或 1.10.3
Chrome 55.0.2883.75(64 位)Ubuntu 16.04
这是一个演示
http://codepen.io/yurigor/pen/yVjeGB
我添加了选项“ignoreChildrensEvents”来解决这个问题
我不确定我是否应该使用此更改发出拉取请求。
我有同样的问题,chrome v55。 我有可拖动的窗口,我想为孩子们获取 mousedown 事件你做了什么来解决这个问题? 你有更改的分支吗,我现在被困住了。
找到了你的分支,它很好地解决了我的问题。 谢谢 YuriGor 这太棒了
乐于帮助!
任何人,谁也需要它,这是一个直接链接:
https://github.com/YuriGor/jquery.panzoom/tree/ignoreChildrensEvents/dist
@timmywil ,如果你想合并我的更改,请帮助我咕噜。
我开始 livereload
grunt watch:dev
但它不起作用。
在http://localhost :35711/ 我有{"tinylr":"Welcome","version":"0.2.1"}
并在
http://localhost :35711/test/index.html
或者
http://localhost :35711/demo/index.html
我有{"error":"not_found","reason":"no such route"}
非常感谢。 这个修复对我来说还不够,但我自己添加了一些来修复我的情况。 (我有多个嵌套的孩子,其中一些应该被忽略,而另一些则不应该)
@timmywil是否可以使用此选项发布新版本?
编辑:其实我和 romi45 有同样的问题。 😞
编辑 2:列出要忽略的元素的选项会有所帮助,例如:
ignoreChildEventsFrom: [".things-to-ignore1", ".things-to-ignore2"]
编辑 3:我想我可能在常见问题解答中找到了解决方案“如果链接位于 Panzoom 元素中,我如何使它们工作?”。
我所做的是在第 969 行注释掉 preventDefault。 preventDefault 将阻止事件到达其子级。
@akhnaz ,
根据我的理解, preventDefault
将阻止与元素(子元素或 panzoom 元素本身)关联的默认操作,而stopPropagation
将阻止事件冒泡到父元素。
FAQ中有一个简单而优雅的解决方案:
$('.panzoom a').on('mousedown touchstart', function( e ) {
e.stopImmediatePropagation();
});
这不需要对库本身进行更改。
嗨@glen-84
是的,preventDefault 将阻止默认操作。 但是,当pointerDown 被调度和监听时,它也会阻止mouseDown 从子节点。
在 chrome 55 中,pointerDown 已经被调度,microsoft edge 已经从一开始就实现了 pointerDown。
在我的情况下,panzoom 听pointerDown,孩子们听mouseDown。
这是我的 jsbin:
你好,
我稍微改进了你的功能。 我将您的选项覆盖为可能的类数组。 目标是仅在孩子具有所列类之一时忽略事件。 当然,只需在实现它时将值设置为真正的工作即可。
我真的没有时间正确分叉并提出拉取请求。 请包括那个小的改进和请求拉入主存储库。
这是从您的 fork 行 959 更新的代码:
if (!options.disablePan || !options.disableZoom) {
events[ str_start ] = function(e) {
if(options.ignoreChildrensEvents) {
if($.isArray(options.ignoreChildrensEvents)) {
if(options.ignoreChildrensEvents.find(function(c){return $(e.target).hasClass(c);})) {
return;
}
}
else if(e.target !== this){
return;
}
}
var touches;
/* rest of code */
ignoreChildrensEvents 选项可以定义为 true、false 或 ['child-class1', 'child-class2']。
问候
请发布包含 ignoreChildrensEvents 的新版本
最有用的评论
乐于帮助!
任何人,谁也需要它,这是一个直接链接:
https://github.com/YuriGor/jquery.panzoom/tree/ignoreChildrensEvents/dist
@timmywil ,如果你想合并我的更改,请帮助我咕噜。
我开始 livereload
grunt watch:dev
但它不起作用。
在http://localhost :35711/ 我有
{"tinylr":"Welcome","version":"0.2.1"}
并在
http://localhost :35711/test/index.html
或者
http://localhost :35711/demo/index.html
我有
{"error":"not_found","reason":"no such route"}