赞
踩
PS:所以这大概是一个几乎没有人翻到的帖子。如果帮到你了别忘留个赞。
来了兄弟们,刚才发现e.stopPropagation();失效了??
我正在对svg的子svg元素进行绑定事件,svg内有多级复杂的svg嵌套.
子svg的点击事件依旧会触发父级svg的点击事件.
查了圈帖子,大概似乎好像确定问题是不同根的原因.
注意:这跟React不触发的原因不一样!
我也是直到翻到了这哥们的帖子才找到灵感:
《e.stopPropagation() 失效原因》
在iframe上和iframe里面同时注册点击事件(未验证)
iframe里面的事件阻止冒泡,但是iframe的事件依旧会触发
放在svg里,似乎好像也会有同样的问题存在吧…
所以我尝试创建了一个空dom放在body内,随后把他指定为事件捕捉对象.
神奇的是…its work!!!
感觉发现了新大陆…
关于setPointerCapture()戳下面链接,它只在pointerevent上生效.
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/setPointerCapture
注意:代码未删减无用部分,vue写的直接cv过来的测试代码,核心解决逻辑在。
//vue单文件组件,上级还嵌套了很多层svg <template > <svg width="16" height="16" ref="svg" @pointerdown="onPointerDown"> <circle cursor="pointer" r="8" :cx="cx" :cy="cy" :fill="style.circle_color" ref="node" /> </svg> </template> <script> export default { props: ["value"], data() { return { cx: 8, cy: 8, style: { circle_color: "white", }, vdom: null, }; }, created() {}, mounted() { this.$nextTick(() => { this.refresh(); //console.log("[BP_NODE]mounted", this.$refs.svg); }); }, destroyed() {}, methods: { onPointerDown(e) { this.vdom = document.body.appendChild(document.createElement("p")); this.vdom.style.cursor = "pointer"; //还可以设置拖拽过程的鼠标指针兄弟们!! this.vdom.setPointerCapture(e.pointerId); this.vdom.addEventListener("pointermove", this.onPointerMove); this.vdom.addEventListener("pointerup", this.onPointerUp); this.vdom.addEventListener("pointercancel", this.onPointerUp); console.log("[BP_NODE]onPointerDown", e, this.vdom); }, onPointerMove(e) { console.log("[BP_NODE]onPointerMove", e); }, onPointerUp(e) { // this.$refs.svg.releasePointerCapture(e.pointerId); this.vdom.releasePointerCapture(e.pointerId); this.vdom.removeEventListener("pointermove", this.onPointerMove); this.vdom.removeEventListener("pointerup", this.onPointerUp); this.vdom.removeEventListener("pointercancel", this.onPointerUp); document.body.removeChild(this.vdom); this.vdom = null; console.log("[BP_NODE]onPointerUp", e); }, refresh() { let bbox = this.bbox(this.$el); this.cx = bbox.width / 2; this.cy = bbox.height / 2; }, bbox(svg) { if (!svg || !svg.getBoundingClientRect) return { bottom: 0, height: 0, left: 0, right: 0, top: 0, width: 0, x: 0, y: 0, }; return svg.getBoundingClientRect(); }, }, }; </script> <style > </style>
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。