我需要编辑(使用javascript)嵌入在html页面中的SVG文档.
加载SVG后,我可以访问SVG及其元素的dom.但我无法知道SVG dom是否准备就绪,因此我无法在加载html页面时对SVG执行默认操作.
要访问SVG dom,我使用以下代码:
var svg = document.getElementById("chart").getSVGDocument();
其中"chart"是embed元素的id.
如果我在html文档准备就绪时尝试访问SVG,这样:
jQuery(document).ready( function() { var svg = document.getElementById("chart").getSVGDocument(); ...
svg始终为null.我只需要知道它何时不为空,所以我可以开始操纵它.你知道有没有办法做到这一点?
在主文档中的嵌入元素(例如'embed','object','iframe')中添加一个onload
调用函数的属性,或者在脚本中添加事件监听器,例如embeddingElm.addEventListener('load', callbackFunction, false)
.另一种选择可能是倾听DOMContentLoaded
,取决于你想要它.
您还可以在主文档上添加加载侦听器.jQuery(document).ready
并不意味着所有资源都被加载,只是文档本身有一个可以采取行动的DOM.但是请注意,如果你在整个文档上监听加载,那么在加载该文档中的所有资源,css,javascript等之前,不会调用回调函数.
如果你使用内联svg,那么jQuery(document).ready
将工作得很好.
另外请注意,您可能需要考虑使用embeddingElm.contentDocument
(如果可用)而不是embeddingElm.getSVGDocument()
.
您可以使用onload事件进行检查.
假设some.svg嵌入在object标签中:
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在一个标签中:
SVG图像基本上位于子文档中,该子文档将具有load
与main 的单独事件document
.但是,您可以侦听此事件并处理它:
var embed = document.getElementById("embedded-image"); embed.addEventListener('load', function() { var svg = embed.getSVGDocument(); // Operate upon the SVG DOM here });
这比轮询更好,因为您对SVG所做的任何修改都会在它首次绘制之前进行,从而减少了绘画时的闪烁和CPU工作量.