Panzoom: Panzoom 在最新的 Chrome 上隐藏子项的 mousedown 事件

创建于 2016-12-07  ·  12评论  ·  资料来源: timmywil/panzoom

我使用这个很棒的插件和 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”来解决这个问题
我不确定我是否应该使用此更改发出拉取请求。

最有用的评论

乐于帮助!
任何人,谁也需要它,这是一个直接链接:
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"}

所有12条评论

我有同样的问题,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中有一个简单而优雅的解决方案:


  1. 如果链接位于 Panzoom 元素中,我该如何使它们工作? 例子
  • 为 mousedown 和 touchstart 事件停止事件传播,以允许 Panzoom 元素中的 Panzoom 元素。 要修复链接,请绑定一个事件处理程序,以防止事件到达 Panzoom 处理程序:
$('.panzoom a').on('mousedown touchstart', function( e ) {
  e.stopImmediatePropagation();
});

这不需要对库本身进行更改。

嗨@glen-84

是的,preventDefault 将阻止默认操作。 但是,当pointerDown 被调度和监听时,它也会阻止mouseDown 从子节点。

在 chrome 55 中,pointerDown 已经被调度,microsoft edge 已经从一开始就实现了 pointerDown。

在我的情况下,panzoom 听pointerDown,孩子们听mouseDown。

@akhnaz

你可以只听孩子的pointerdown并停止立即传播......

https://jsbin.com/sicapuledo/edit?html ,js,console,output

你好,

我稍微改进了你的功能。 我将您的选项覆盖为可能的类数组。 目标是仅在孩子具有所列类之一时忽略事件。 当然,只需在实现它时将值设置为真正的工作即可。

我真的没有时间正确分叉并提出拉取请求。 请包括那个小的改进和请求拉入主存储库。

这是从您的 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 的新版本

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

rpallares picture rpallares  ·  3评论

kylegoines picture kylegoines  ·  4评论

jsblanco picture jsblanco  ·  19评论

ronvillalon picture ronvillalon  ·  8评论

adred picture adred  ·  21评论