2011-10-05 70 views
6

我有一個SVG文檔,我希望能夠在其中包含腳本(使用<script>標籤)。在這個腳本里面,我想設置一個函數,當文檔已經加載並且可以進行操作時會被調用。SVG:加載文檔時運行腳本

如果我使用HTML和JQuery來做這件事,我只需要使用$(document).ready(...)。我期望在SVG文檔中做同樣的事情,但顯然我不能以相同的方式使用JQuery。

總之,我要找的是一樣的東西:

test.svg:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg"> 
    <script type="text/ecmascript" xlink:href="myscript.js" /> 

    <!-- Rest of SVG body goes here --> 
</svg> 

myscript.js:

function init(evt) { 
    var svgDocument = evt.target.ownerDocument; 
    var svgRoot = svgDocument.documentElement; 
    // Manipulate SVG DOM here 
} 

// --> Somehow attach init() function to onload event of SVG <-- 

我想嘗試在腳本中執行此操作,而不是依賴明確的SVG定義中的。 (我想編寫一個可能包含在幾個SVG中的腳本,而不需要知道腳本如何工作)。

回答

2

也許'onload'是您要查找的事件。看​​3210

+0

可能是,但我正在尋找一種方法來通過JavaScript從** SVG(或至少包含從'

6

下面是一個例子

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" onload='init(evt)'> 
<script type="text/ecmascript"> 
function init(evt) { 
var svgDocument = evt.target.ownerDocument; 
var svgRoot = svgDocument.documentElement; 
// Do whatever you like on svgRoot to manipulate your SVG DOM 
} 
</script> 
</svg> 
+0

謝謝。這大致是我想要實現的。然而,我想要做的是避免在''標籤中添加'onload =「...」''。我已經更新了原始問題以使這個更清晰(我希望!)。 – FixMaker

2

沒事(但IE)阻礙你使用的JS標準DOM事件處理程序嵌入SVG:

document.addEventListener('load', init); 

對於IE瀏覽器,您通常使用attachEvent左右,但我不知道,如果IE(> = 9)在SVG中支持這個。

大多數情況下,SVG文件是獨立的,所以DOMReady(又名DOMContentLoaded)和加載事件並沒有太大的區別(與HTML相比,需要加載數十個CSS文件和圖像)。所以與使用加載事件而不是DOMReady事件(這不幸尚未標準化穩定)將被忽略。除此之外,我從來沒有嘗試過,如果瀏覽器甚至發起DOMReady事件,當SVG的DOM加載。

2

您可以嘗試將腳本包含在svg文檔的最後,然後您不需要等待加載事件。但是,如果您正在引用文檔ant中的任何外部文件,但腳本運行時尚未加載它們,則可能會失敗。