【问题标题】:jQuery select SVG anchor elements inside <object> tagjQuery 选择 <object> 标签内的 SVG 锚元素
【发布时间】:2021-02-03 17:16:26
【问题描述】:

我在使用 SVG 中内置的锚元素(显示为 &lt;object&gt;)时遇到了很多麻烦。我正在尝试使用 jQuery 来定位对象中的锚元素,以便在单击时切换其各自的内容。

如果您看一下我的示例,我的 SVG 中内置了 3 个链接(它们的绿色阴影比其他链接浅)。我使用 InkScape 来创建我的 SVG 图像,并且在链接的浅绿色区域上只是具有分别等于“#operable-shades”、“#gutters-downspouts”和“#gable-pediments”的 href 属性的形状。

我的 SVG 在我的页面上显示得很好(使用 &lt;object&gt; 标签),当我将鼠标悬停在我创建的链接上时,我得到了原始对象数据 URL,并在其末尾附加了我指定的锚点(例如'https ://example.com/wp-content/uploads/GHB_Interface-v0.1.svg#gable-pediments')当我期望它是'https://example.com/#gable-pediments'时。/#gable-pediments' p>

<script type="text/javascript">
jQuery(document).ready(function($) {
    $('.ghb_toggle').hide()
    $('a[href^="#"]').on('click', function(event) {
        var target = $(this).attr('href');
        $(target).toggle();
    });
});
</script>
.ghb_toggle {
  display:none;
}
<object type="image/svg+xml" data="https://example.com/wp-content/uploads/test.svg" width="500" height="400"></object>

<div id="gable-pediments" class="ghb_toggle">
  <p>Content 1</p>
</div>

<div id="gutters-downspouts" class="ghb_toggle">
  <p>Content 2</p>
</div>

<div id="operable-shades" class="ghb_toggle">
  <p>Content 3</p>
</div>

如何修改我的 jQuery 以便能够成功地与我的 &lt;object&gt; 中的锚元素交互以隐藏/显示具有唯一标识符的相应内容?

【问题讨论】:

  • 我认为通过对象元素导入时不能选择 svg 标签。就像使用图像时不能一样。
  • 您可以这样做,但前提是 标记的内容与页面的域相同。在问题的示例中,它们不是。
  • 不幸的是,图像本身是巨大的,所以我什至不能把它变成一个数据 URL 来构建一个答案,所以我们仍然需要一个 minimal reproducible example ,即使用一个小测试的东西SVG 文件。
  • @RobertLongson 我今天学到了一些东西。谢谢!

标签: javascript html jquery svg anchor


【解决方案1】:

要定位在&lt;object&gt;&lt;iframe&gt; 中加载的svg 文档的内容,您需要将正确的文档上下文传递给jQuery:您可以通过嵌入元素的.contentDocument 属性访问该上下文。

请注意,这要求 svg 文档以同源方式加载,这在 StackSnippets 的空源帧中是不可能的,所以这里是 live plnkr

$( "object" ).on( "load", (evt) => {
  const svg_doc = this.contentDocument;
  $( "a[href]", svg_doc ) // second argument is context
    .on( 'click', (evt) => {
      // add your listener here
    } );
};

还请注意,在您的 svg 中,您定义了 xlink:href 属性,而不仅仅是 href,因此您的 jQuery 选择器应该是 'a[xlink\\:href^="#"]'


但是,如果您的目标是将 svg 中的锚点设置为相对于其他基本 URL 而不是加载文档的基本 URL,那么您不需要所有这些,您可以简单地插入一个 HTML &lt;base&gt; 元素您的 svg 文档的开头和所有相关 URL 都将使用它。
plnkr 和更复杂的 sn-p 形式查看现场演示:

// To be able to embed it in a StackSnippet (directly in this answer),
// we need to generate the file in memory from JS
// you don't need it
const svg_content = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="300" >
  <!-- we must declare it in the HTML namespace -->
  <base xmlns="http://www.w3.org/1999/xhtml" href="https://google.com" />
  <a href="#foo-bar">
    <rect fill="green" x="10" y="10" width="30" height="30" />
  </a>
</svg>
`;
const svg_blob = new Blob( [ svg_content ], { type: "image/svg+xml" } );
const svg_url = URL.createObjectURL( svg_blob );
document.querySelector( "object" ).data = svg_url;
&lt;object&gt;&lt;/object&gt;

【讨论】:

  • 你就是那个男人!通过一些测试,我发现我确实能够在我的 SVG 中定位我的锚元素!现在我必须弄清楚如何处理切换内容。我使用的是var target = $(this).attr('xlink\\:href');,然后是$(target).toggle();,但我似乎无法获得任何类似的东西来实际切换具有唯一标识符的&lt;div&gt;元素。
  • 在您的事件处理程序中,您可以正常访问主文档。
猜你喜欢
  • 2020-04-05
  • 2020-04-11
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多