是否可以在 SVG 标签上使用点击功能?我在 <polygon> 上尝试了 element.click()。尝试使用 javascript 模拟点击。不工作

Posted

技术标签:

【中文标题】是否可以在 SVG 标签上使用点击功能?我在 <polygon> 上尝试了 element.click()。尝试使用 javascript 模拟点击。不工作【英文标题】:Is it possible to use click function on SVG tags? I tried element.click() on a <polygon>. Trying to simulate the click using javascript. Doesn't work 【发布时间】:2018-09-08 22:23:43 【问题描述】:

//尝试从下面的 html 中检索 HTML 元素并尝试使用下面的 javascript 代码点击它

    <html>
        <svg  >
        <polygon points="100,10 40,198 190,78 10,78 160,198"
  style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" />
        </svg>
    </html>

    <script>
        var polygons = document.getElementsByTagName('polygon');
        if(polygons.length>0)
        
            //This statement doesn't work. Trying to simulate the click on the polygon element. The click function doesn't click it
            polygons[0].click();
        
    </script>

【问题讨论】:

click() 应该做什么?您是否想在单击多边形时运行一些 javascript,如果是,请为单击事件添加 onclick 属性或事件处理程序。 感谢罗伯特的回复。我正在尝试使用 DOM click 函数使用 javascript 来模拟对多边形元素的点击。但它没有点击。我尝试使用 onclick 功能进行日志记录,但没有创建任何日志。提前致谢。 当你点击一个多边形时会发生什么,你会调用一些javascript函数吗?如果是这样,只需直接调用该 javascript 函数。 我正在尝试使用 WPT 进行一些自动化,以进行需要单击它的性能测试。为此,我正在使用 javascript 模拟点击。单击时会调用其他函数。再次感谢。 手动点击时通常会发生什么?直接在您的 WPT 中调用这些函数。 【参考方案1】:

与我的同伴相反,我会故意和善意地忽略您没有设置点击事件侦听器这一事实,而是会回答大家在这里错过的问题。


您尝试使用的click 方法是HTMLElement.click 方法。 此方法适用于所有继承自 HTMLElement 的元素,但您的 &lt;polygon&gt; 是一个 SVGPolygonElement,它不继承自 HTMLElement。

所以不,你不能在这个元素上使用这个方法,因为它的原型链中没有定义这样的方法。

// an SVGElement
var poly = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
// an HTMLElement
var unknown = document.createElement('foo');

console.log('<polygon> (SVG element)');
console.log('has click method:', !!poly.click);
console.log('inherits from HTMLElement:', poly instanceof HTMLElement);

console.log('//////////////////');

console.log('<foo> (HTML element)');
console.log('has click method:', !!unknown.click);
console.log('inherits from HTMLElement:', unknown instanceof HTMLElement);

但即使此方法不可用,您也可以通过编程方式触发点击事件,例如使用EventTarget.dispatchEvent 方法。

var poly = document.getElementById('poly');
poly.dispatchEvent(new Event('click'));

function _log(evt) 
  console.log('clicked');
<svg>
<polygon id="poly" points="60,20 100,40 100,80 60,100 20,80 20,40" onclick="_log()"/>
</svg>

或者由于您的问题似乎与 WPT 有关(我真的不知道),您似乎也可以使用 sendClick 方法做同样的事情,但再一次,我不知道 WPT 并且我刚从快速阅读的文档中得到它。

【讨论】:

谢谢凯多。这清楚地回答了我的问题。非常感谢。【参考方案2】:

是的,这很有可能,但您必须先向多边形添加一个事件侦听器:

document.querySelector('polygon').addEventListener('click', () =&gt; console.log('clicked'));
<svg  >
  <polygon points="100,10 40,198 190,78 10,78 160,198"
           style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" />
</svg>

【讨论】:

这不能回答 OP 的问题。 OP 希望以编程方式触发元素上的单击事件。没有抓到一个。

以上是关于是否可以在 SVG 标签上使用点击功能?我在 <polygon> 上尝试了 element.click()。尝试使用 javascript 模拟点击。不工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 onclick 使 svg 图像对象可点击,避免绝对定位

在图像标签中使用 cshtml?

使用嵌入或对象标签中的元素

如何在 SVG 上添加链接

Bootstrap 弹出框触发焦点不适用于 SVG <g> 标签

如何使用SVG滤镜创建模糊的标签背景?