代码之家  ›  专栏  ›  技术社区  ›  Muhammad Amir

在Firefox中querySelector带有属性,而在svg中查找路径时出错

  •  1
  • Muhammad Amir  · 技术社区  · 1 年前

    我的代码在Chrome中运行良好,但在Firefox中运行不好。

    当我使用具有属性Firefox的querySelector搜索路径元素时,会出现找不到路径的错误。

    defs.appendChild(svgGradient);
    const path = this.#svg.querySelector(`[ElementName="${this.#name}"]`);
    path.setAttribute("fill", `url(#${gradientId})`);
    

    当我搜索id为的路径时,我能够找到路径。所以我怀疑Firefox中带有属性标记的查询不支持,或者我犯了一个错误,有人能纠正我吗?

    下面是我得到的错误

    Uncaught TypeError: path is null
        fillGradient texture.js:144
        Texture texture.js:60
        emit events.js:153
        setListeners gradient.js:207
    texture.js:144
    

    this.#svg 包含svg标记和 #name 是所选零件的标识符。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Phil    1 年前

    运行一个快速测试,我发现Chrome和Firefox都将属性解释为小写 elementname .

    console.log(document.querySelector('svg').innerHTML);
    <svg><path ElementName="foo" /></svg>

    虽然Chrome可以在任何情况下查询元素,但Firefox需要严格匹配

    const svg = document.querySelector('svg');
    ['ElementName', 'elementname', 'ElEmEnTnAmE'].forEach((attr) => {
      console.log(attr, svg.querySelector(`[${attr}]`) !== null);
    });
    <svg>&书信电报;path ElementName=“foo”/></svg>

    在Chrome中,这些都是 true 但Firefox只匹配 elementname .

    我建议将您的自定义属性规范化为小写/kebab大小写,例如

    <path element-name="foo" />