如何检查一个embedded的SVG文档是否加载到一个HTML页面?

我需要编辑(使用JavaScript)一个embedded在HTML页面的SVG文档。

当SVG加载时,我可以访问SVG及其元素的dom。 但是我无法知道SVG dom是否准备好,所以我不能在加载html页面时在SVG上执行默认操作。

要访问SVG dom,我使用这个代码:

var svg = document.getElementById("chart").getSVGDocument(); 

其中“图表”是embedded元素的ID。

如果我在html文档准备就绪的时候尝试访问SVG,就这样:

 jQuery(document).ready( function() { var svg = document.getElementById("chart").getSVGDocument(); ... 

svg始终为空。 我只是需要知道什么时候它不是空的,所以我可以开始操纵它。 你知道有没有办法做到这一点?

你可以尝试每隔一段时间进行一次投票。

 function checkReady() { var svg = document.getElementById("chart").getSVGDocument(); if (svg == null) { setTimeout("checkReady()", 300); } else { ... } } 

在主文档中embedded元素(例如'embed','object','iframe')添加一个调用你的函数的onload属性,或者添加脚本中的事件监听器,比如embeddingElm.addEventListener('load', callbackFunction, false) 。 另一种select可能是侦听DOMContentLoaded ,取决于你想要的。

您还可以在主文档上添加一个负载监听器。 jQuery(document).ready并不意味着所有资源都被加载,只是文档本身有一个准备好动作的DOM。 但是请注意,如果您在整个文档中侦听负载,那么只有在该文档中的所有资源都被加载后,才会调用callback函数,CSS,JavaScript等。

如果你使用内联svg,那么jQuery(document).ready就可以正常工作。

在进一步的注意你可能要考虑使用embeddingElm.contentDocument (如果可用),而不是embeddingElm.getSVGDocument()

您可以使用onload事件进行检查。

假设some.svgembedded在object标签中:

 <body> <object id="svgholder" data="some.svg" type="image/svg+xml""></object> </body> 

jQuery的

 var svgholder = $('body').find("object#svgholder"); svgholder.load("image/svg+xml", function() { alert("some svg loaded"); }); 

JavaScript的

 var svgholder = document.getElementById("svgholder"); svgholder.onload = function() { alert("some svg loaded"); } 

假设您的SVG位于<embed>标签中:

 <embed id="embedded-image" src="image.svg" type="image/svg+xml" /> 

SVG图像本质上是在一个子文档中,它将有一个单独的load事件到主document 。 但是,您可以听取此事件并处理它:

 var embed = document.getElementById("embedded-image"); embed.addEventListener('load', function() { var svg = embed.getSVGDocument(); // Operate upon the SVG DOM here }); 

这比轮询更好,因为您对SVG所做的任何修改都会在第一次绘制之前发生,从而减less了花费在绘图上的闪烁和CPU花费。

embedded元素(例如对象)的加载事件将是我的偏好,但是,如果由于某种原因,这不是一个可行的解决scheme,我发现SVG DOM准备就绪的唯一通用和可靠的testing是SVG的getCurrentTime方法根元素:

 var element = document.getElementById( 'elementId' ); var svgDoc = element.contentDocument; var svgRoot = svgDoc ? svgDoc.rootElement : null; if ( svgRoot && svgRoot.getCurrentTime && ( svgRoot.getCurrentTime() > 0 )) { /* SVG DOM ready */ } 

W3C SVG推荐指出SVGSVGElement上的getCurrentTime:

以秒为单位返回相对于当前SVG文档片段的开始时间的当前时间。 如果在文档时间轴开始之前调用getCurrentTime(例如,在调度文档的SVGLoad事件之前,脚本运行在“脚本”元素中),则返回0。

使用jQuery,你可以绑定到Erik提到的窗口加载事件:

 $(window).load(function(){ var svg = document.getElementById("chart").getSVGDocument(); }); 

您可以将一个onload事件处理程序分配给SVG文档中的一个元素,并让它在html页面中调用一个javascript函数。 加载映射到SVGLoad。

http://www.w3.org/TR/SVG11/interact.html#LoadEvent

事件在用户代理已经完全parsing元素及其后代的时刻被触发,并准备好在该元素上适当地行动