You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Leaflet中多十六进制颜色的EncodeURI SVG图标失效问题

React-Leaflet 自定义SVG图标多十六进制颜色失效问题解决

问题场景

在React-Leaflet开发中,为Marker使用URI编码的自定义SVG图标时,仅单个元素用十六进制颜色(如#D7629B)时图标正常显示:

var stopCircleSvg = 
  '<svg xmlns="http://www.w3.org/2000/svg" width="67" height="67">'+ 
  '<g>' +
    '<circle id="1" cx="34" cy="34" r="3" stroke="#D7629B" stroke-width="1.5" fill="none"/>' +
    '<circle id="2" cx="34" cy="34" r="1" fill="red" />' +
  '</g>' + 
'</svg>';

var url = encodeURI("data:image/svg+xml," + stopCircleSvg).replace("#", "%23");
var CustomIcon = Icon.extend({
  options: {
    iconSize: [stopCircleSize, stopCircleSize],
    iconAnchor: [stopCircleSize / 2, stopCircleSize / 2],
  },
});
// 使用示例
icon={
  new CustomIcon({ iconUrl: url })
}

但当多个元素使用十六进制颜色时,SVG图标直接失效:

var stopCircleSvg = 
  '<svg xmlns="http://www.w3.org/2000/svg" width="67" height="67">'+ 
  '<g>' +
    '<circle id="1" cx="34" cy="34" r="3" stroke="#D7629B" stroke-width="1.5" fill="none"/>' +
    '<circle id="2" cx="34" cy="34" r="1" fill="#D7629B" />' +
  '</g>' + 
'</svg>';
var url = encodeURI("data:image/svg+xml," + stopCircleSvg).replace("#", "%23");

问题原因

replace("#", "%23")默认只会替换第一个匹配到的#字符,当SVG中有多个十六进制颜色时,剩下的#没有被转义,导致URI格式不合法,浏览器无法正确解析SVG内容。

解决方法

将替换操作改为全局替换,通过正则表达式的g标志匹配所有#:

var url = encodeURI("data:image/svg+xml," + stopCircleSvg).replace(/#/g, "%23");

这样所有的十六进制颜色前缀#都会被转义为URI合法的%23,SVG就能正常渲染了。

内容的提问来源于stack exchange,提问作者Shakedk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:55:31