如何检查一个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元素及其后代的时刻被触发,并准备好在该元素上适当地行动