javascript - 单击SVG圆形元素时如何带参数调用函数
问题描述
在一个网站上,我需要使用 SVG 世界地图,我想更改 5 个点以使它们可点击并更改它们的颜色和大小。单击后,我想显示带有一些描述的弹出窗口(使用 JS)。
当我单击特定点时如何执行 JS 脚本。如何调用函数并向其传递一些参数。
下面是 SVG 地图的一部分。
<svg xmlns="http://www.w3.org/2000/svg" max-width="1000" max-height="820" viewBox="0 0 201 97"><g fill="rgba(0,0,72)"><circle cx="191" cy="90" r=".3"/><circle cx="190" cy="90" r=".3"/><circle cx="189" cy="90" r=".3"/><circle cx="192" cy="89" r=".3"/><circle cx="191" cy="89" r=".3"/><circle xmlns="http://www.w3.org/2000/svg" cx="190" cy="89" r=".9" fill="rgba(204,153,24)"/><circle cx="193" cy="88" r=".3"/><circle cx="192" cy="88" r=".3"/><circle cx="178" cy="88" r=".3"/><circle cx="177" cy="88" r=".3"/><circle cx="194" cy="87" r=".3"/><circle cx="179" cy="87" r=".3"/><circle cx="178" cy="87" r=".3"/><circle cx="197" cy="86" r=".3"/><circle cx="196" cy="86" r=".3"/><circle cx="199" cy="85" r=".3"/><circle cx="198" cy="85" r=".3"/><circle cx="197" cy="85" r=".3"/><circle cx="179" cy="85" r=".3"/><circle cx="198" cy="84" r=".3"/><circle cx="182" cy="84" r=".3"/><circle cx="181" cy="84" r=".3"/><circle cx="180" cy="84" r=".3"/><circle cx="179" cy="84" r=".3"/><circle cx="178" cy="84" r=".3"/><circle cx="177" cy="84" r=".3"/><circle cx="198" cy="83" r=".3"/><circle cx="182" cy="83" r=".3"/><circle cx="181" cy="83" r=".3"/><circle cx="180" cy="83" r=".3"/><circle cx="179" cy="83" r=".3"/><circle cx="178" cy="83" r=".3"/></g></svg>
我已经尝试了几个解决方案,但没有任何效果,所以在这里粘贴它是没有意义的。
解决方案
使用 querySelectorAll
首先,圆圈现在更具可读性,当圆圈不是很小时,svg 看起来更好:)
其次,我将它们全部调用document.querySelectorAll
并添加到每个eventlistener
将通过单击运行功能的位置。
并根据您的要求更改颜色和大小,并在需要时在评论中发出警报。
document.querySelectorAll("circle")?.forEach(el => {
el.addEventListener("click", function (ev) {
const circle = ev.target;
if (Number(circle.getAttribute("r")) === 2) {
circle.style = "fill: green";
circle.setAttribute("r", 4);
} else {
circle.style = "fill: rgba(0,0,72)";
circle.setAttribute("r", 2);
}
// alert("some description (using JS)");
})
})
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300" viewBox="-10 -10 100 100">
<g fill="rgba(0,0,72)">
<circle class="circle" cx="191" cy="90" r="2" />
<circle cx="5" cy="5" r="2" />
<circle cx="10" cy="10" r="2" />
<circle cx="5" cy="20" r="2" />
<circle cx="10" cy="20" r="2" />
<circle cx="20" cy="20" r="2" />
<circle cx="30" cy="20" r="2" />
<circle cx="40" cy="20" r="2" />
<circle cx="50" cy="20" r="2" />
<circle cx="60" cy="20" r="2" />
<circle cx="30" cy="30" r="2" />
<circle xmlns="http://www.w3.org/2000/svg" cx="35" cy="10" r="3" fill="rgba(204,153,24)" />
<circle cx="40" cy="40" r="2" />
<circle cx="50" cy="50" r="2" />
<circle cx="60" cy="60" r="2" />
<circle cx="60" cy="5" r="2" />
<circle cx="60" cy="10" r="2" />
<circle cx="60" cy="20" r="2" />
<circle cx="60" cy="30" r="2" />
<circle cx="60" cy="40" r="2" />
<circle cx="60" cy="50" r="2" />
</g>
</svg>
推荐阅读
- wagtail - 创建自定义 Wagtail OEmbedFinder
- image - 如何在 matlab 中读取 HEIC 图像?
- css - 更改 img src SVG 颜色
- scala - 在 akka-http 完整函数调用中处理 akka-stream 中的异常
- python-3.x - ipcamera /shot.jpg 使用 python3 使用 cv2 进行面部识别
- c - 将 c 中的代码段转换为伪代码
- python - 如何在 Windows10 上从 Docker 映像运行的 Jupyter Notebook 上安装包
- php - 在 PHP 示例中创建配置文件
- c# - C# Value too large for Decimal 的解决方法
- javascript - 如何从下拉列表中获取选择值的 ID 并使用 ajax 将其发送到 php 中的模式?