javascript - jQuery:从具有多个节点的 HTML 字符串中提取最顶层的 SVG 元素

标签 javascript jquery html svg

This questionthis question是相似的,但答案并没有产生一个干净、一致的方法来在不同的 HTML 字符串中查找最上面的 SVG 元素。

目标是从 HTML 字符串中提取最顶层的 SVG 元素。

$(htmlString).find("svg") 不起作用。

$($.parseHTML(htmlString)) 仅生成一组 jQuery 对象,但目标是将 htmlString 转换为一个可以执行的 jQuery 对象查找并检索最顶层的 SVG 元素。

HTML 字符串示例:

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 424 424" style="enable-background:new 0 0 424 424;" xml:space="preserve" width="512px" height="512px">
<g>
    <g>
        <path d="M35,89C15,89,0,74,0,54s15-36,35-36h353c20,0,36,16,36,36s-16,35-36,35H35z" fill="#7c7a7d"/>
        <path d="M388,176c20,0,36,16,36,36s-16,35-36,35H35c-20,0-35-15-35-35s15-36,35-36H388z" fill="#7c7a7d"/>
        <path d="M388,335c20,0,36,15,36,35s-16,36-36,36H35c-20,0-35-16-35-36s15-35,35-35H388z" fill="#7c7a7d"/>
    </g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

$($.parseHTML(htmlString)) 的结果,其中 htmlString 是上面的字符串:

$($.parseHTML(htmlString))

w.fn.init(6) [comment, text, comment, text, svg#Capa_1, text]
0: comment
1: text
2: comment
3: text
4: svg#Capa_1
5: text
length: 6

最佳答案

您不能使用find在结果上,因为您给 jQuery 的标记不代表树:Doctype 和注释节点是您的 <svg> 的兄弟节点.

因此,您需要filter jQuery 条目以便仅保留 svg 节点:

const $svg = $(`<?xml version="1.0" encoding="utf-8"?>
<!-- comment1  -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 424 424">
  <g>
    <g>
      <path d="M35,89C15,89,0,74,0,54s15-36,35-36h353c20,0,36,16,36,36s-16,35-36,35H35z" fill="#7c7a7d"/>
      <path d="M388,176c20,0,36,16,36,36s-16,35-36,35H35c-20,0-35-15-35-35s15-36,35-36H388z" fill="#7c7a7d"/>
      <path d="M388,335c20,0,36,15,36,35s-16,36-36,36H35c-20,0-35-16-35-36s15-35,35-35H388z" fill="#7c7a7d"/>
    </g>
  </g>
</svg>`)
.filter((i, el) => $(el).is('svg'));

console.log($svg.attr('id'));
$svg.find('path').attr('fill', 'red');
$('body').append($svg);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

现在,您可能还想使用 native DOMParser,它可能比 jQuery 更擅长处理命名空间。从那里,您将拥有一个 XMLDocument,其 documentElement将是您的<svg>节点。 然后您将能够通过 jQuery 进行处理:

const str = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 424 424">
  <g>
    <g>
      <path d="M35,89C15,89,0,74,0,54s15-36,35-36h353c20,0,36,16,36,36s-16,35-36,35H35z" fill="#7c7a7d"/>
      <path d="M388,176c20,0,36,16,36,36s-16,35-36,35H35c-20,0-35-15-35-35s15-36,35-36H388z" fill="#7c7a7d"/>
      <path d="M388,335c20,0,36,15,36,35s-16,36-36,36H35c-20,0-35-16-35-36s15-35,35-35H388z" fill="#7c7a7d"/>
    </g>
  </g>
</svg>`;

const doc = (new DOMParser).parseFromString(str, 'image/svg+xml');
// use the second argument (context) of jQuery()
const $svg = $('svg', doc);
console.log($svg.attr('id'));
$svg.find('path').attr('fill', 'red');
$('body').append($svg);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

关于javascript - jQuery:从具有多个节点的 HTML 字符串中提取最顶层的 SVG 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173666/

相关文章:

javascript - 手动将pcm数据放入AudioBuffer

php - 登录系统设计允许每个用户一次登录一台机器

jquery - animate.css 和基于 jQuery 的滚动动画

javascript - native 滚动条覆盖

html - 列表不会水平居中

javascript - 让所有没有某个类(class) child 的 parent

javascript - toFixed 不适用于值 3.675

jquery - 将打开和关闭状态应用于同一个按钮?

javascript - 我如何在每一行添加删除按钮?

javascript - JS vs JSON 用于 Node js 中的配置