1 回答
TA贡献1906条经验 获得超3个赞
<object>
要定位在, 或中加载的 svg 文档的内容<iframe>
,您需要将正确的文档上下文传递给 jQuery:您可以从.contentDocument
嵌入元素的属性访问的上下文。
请注意,这要求 svg 文档以同源方式加载,这在 StackSnippets 的空源帧中是不可能的,所以这里是一个实时的 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,那么您不需要所有这些,您可以简单地在 svg 文档的开头插入一个 HTML<base>
元素并且所有相对 URL 都将使用它。
将现场演示视为plnkr和更复杂的片段:
// 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;
<object></object>
添加回答
举报