Leman
Leman
遇到同样的问题,Firefox下正常,Chromium内核的会复现。快捷键的监听函数绑定在container上,看样子是点击svg内的节点,第一下点击时svg元素时,document.activeElement元素居然是body,第二下再点击active的是svg中g元素。而Firefox是始终是container元素。
### 排查了几天,发现了这个问题的原因 源码中,BaseNode的toFront方法会改变节点的dom顺序(因为svg中的元素只能通过修改同级中的顺序,而非z-index,改变谁在上、谁在下)。 而Chrome支持svg中的g元素获取焦点,点击g元素时,可以通过document.activeElement查看到当前获取到焦点的就是BaseNode的最外层g元素,从而focus事件可以冒泡到logicflow实例的container,从而触发快捷键。 但是如果diff算法判断出的当前获取到焦点的元素需要在点击后发生移动,即调用parent.insertBefore(curElm, refElm),浏览器的行为是取消该元素的焦点选择, 而Firefox当前是不支持g元素获取焦点的,不管怎么点击BaseNode,可以看到document.activeElement永远是logicflow实例的Container。 ### 解决办法: 为节点添加事件监听,推荐绑定 node:focus,主动让logicflow的container获取焦点。 ``` lf.on('node:focus', (_e) => { lf.container.focus(); }); ``` @fy-store @modstart