d3.select 在 inkscape:label="foo"

d3.select on inkscape:label="foo"

我正在尝试 select 图层 inkscape:label 属性 以便能够 show/hide 网站上的图层。

function hideFOO() {
    if(d3.select("#hideFOO:checked").node()){
        d3.select("#layer11").attr("visibility", "hidden");
    } else {
        d3.select("#layer11").attr("visibility", "visible");        
    }
}

SVG 是;

<g
     inkscape:groupmode="layer"
     id="layer11"
     inkscape:label="foo"
     style="display:inline"> ...

效果很好 - 但我希望能够指定 inkscape:label,因为层 ID 在多个 SVG 中不相同,但层名称是。

当我尝试类似的东西时; d3.select(":inkscape:label='foo'").attr("visibility", "hidden"); 我只是被告知; SyntaxError: ':inkscape:label='foo'' is not a valid selector

d3.select("$('g[inkscape:label="foo"]')").attr("visibility", "hidden"); 这告诉我 SyntaxError: missing ) after argument list 尽管我所有的 ')' 都已关闭?!

基于下面的解决方案 - 我也尝试过 d3.select('g[inkscape\:label = "foo"]').attr("visibility", "hidden"); 但它也没有隐藏图层 - 在浏览器的开发控制台中播放时,似乎 d3.select 不匹配路径。

这是使用 CSS 将可见性变为隐藏的方法:

想法是你需要使用inkscape的命名空间

/*declare the prefix for the namespace*/
@namespace ink "http://www.inkscape.org/namespaces/inkscape";

/*escape the colon : or use the pipe |*/
[inkscape\:label="foo"], [ink|label="foo"] {
/*visibility:hidden*/
fill:red;}

svg{border:1px solid}
<svg>
  <g
     inkscape:groupmode="layer"
     id="layer11"
     inkscape:label="foo"
     style="display:inline">
    <rect width="100" height="50"/>
  </g>
</svg>

请阅读这篇关于XML Namespaces in CSS, a Using SVG with CSS3 and HTML5补充的文章Material

这就是使用 javascript 的方法(您不能在 querySelector()querySelectorAll() 方法中使用命名空间前缀):

let g = document.querySelector('g[inkscape\:label = "foo"]')
 //g.style.visibility = "hidden"
 g.style.fill = "red"
svg{border:1px solid}
<svg>
  <g
     inkscape:groupmode="layer"
     id="layer11"
     inkscape:label="foo"
     style="display:inline">
    <rect width="100" height="50"/>
  </g>
  
</svg>

在无休止地使用命令之后,我终于以某种方式偶然发现了这个解决方案,它似乎按预期工作,不需要我指定任何名称空间等。

function hideFOO() {
    if(d3.select("#hideFOO:checked").node()){
        d3.select("g[*|label='foo']").attr("visibility", "hidden");
    } else {
        d3.select("g[*|label='foo']").attr("visibility", "visible");        
    }
}

我试图在加载 svg 时声明命名空间,它在查询控制台中显示已注册,但如果我尝试指定 inkscape|label 它只是抱怨选择器无效.. . 我想使用 *|label 的唯一问题是,如果在单独的名称空间中有其他东西用 label 标识,它会导致问题。

如果有人可以建议如何让它像 inkscape|label='foo' 一样工作,请在下面发表评论。

我刚刚还发现旧版本的 IE (11) 不喜欢这个,不会按预期隐藏或显示图层。