SVG元素无.click()方法时如何触发绑定的点击处理函数
SVG按钮自动化点击实现方案
首先明确两个错误写法的问题:
- 直接调用
document.getElementsByClassName("smart-button-svg")[0].handleSmartButtonClicked()无法生效。handleSmartButtonClicked是Vue组件内部的方法,只挂载在组件实例上,不会暴露给真实DOM节点,直接在DOM上调用会报方法不存在的错误。 - 直接调用
.click()报错,通常是两个原因:一是获取元素时机不对,代码执行时目标SVG按钮还没渲染完成,拿到的是其他同名class的无关元素;二是选择器太宽泛,选中了SVG内部不支持click方法的子节点。
可用实现方法
方法1:派发标准鼠标点击事件(通用性最高)
用浏览器原生事件构造方法生成点击事件,派发给目标元素即可,这种方式完全模拟真实用户点击,会走Vue绑定的所有事件逻辑,代码如下:
// 用更精准的选择器定位目标按钮,避免选中其他元素 const target = document.querySelector('div.smart-button.tile > svg.smart-button-svg'); // 构造冒泡的点击事件,Vue的事件绑定依赖冒泡机制,bubbles必须设为true const clickEvt = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); target.dispatchEvent(clickEvt);
如果执行时提示找不到target,加个延时或者轮询等元素渲染完成再执行即可。
方法2:获取Vue实例直接调用内部方法
Vue2框架会把组件实例挂在根DOM节点的__vue__属性上,找到组件根节点后可以直接调用内部方法,不需要模拟事件:
// 定位组件根DOM(class带smart-button和tile的div) const componentRoot = document.querySelector('div.smart-button.tile'); // 拿到Vue组件实例 const vm = componentRoot.__vue__; // 直接调用方法 vm.handleSmartButtonClicked();
注意部分做了安全加固的站点、微前端嵌套场景可能会抹掉__vue__属性,这种场景下用方法1即可。
额外说明
从贴出的组件源码可以看到,按钮点击逻辑有判断:如果组件的disabled属性为true,无论用哪种方式触发,都不会向外抛出buttonClicked事件,点击不会生效。
内容的提问来源于stack exchange,提问作者Sebastian Scholz
相关产品推荐
相关产品推荐

