2010-07-15 73 views
0

問候,如何將腳本加載到XUL應用程序的初始加載後

我的XUL應用程序需要動態地加載腳本,爲了這個,我得到的是,在常規的HTML/JS應用工作的功能:

function loadScript(url) 
{ 
    var e = document.createElement("script"); 
    e.src = url; 
    e.type="text/javascript"; 
    document.getElementsByTagName("head")[0].appendChild(e); 
} 

的東西,應該在XUL工作:

function loadScript(url) 
{ 
    var e = document.createElement("script"); 
    //I can tell from statically loaded scripts that these 2 are set thru attributes 
    e.setAttribute('type' , "application/javascript"); //type is as per MDC docs 
    e.setAttribute('src' , url); 
    //XUL apps attach scripts to the window I can tell from firebug, there is no head 
    document.getElementsByTagName("window")[0].appendChild(e); 
} 

標籤得到正確添加的腳本,屬性看起來不錯,但它並沒有在所有的工作,執行這些加載的腳本里面沒有代碼甚至解析。

任何人都可以暗示可能會發生什麼?

T.

回答

3

好吧,

像往常一樣,每當我張貼在堆棧溢出,答案將很快直通一個孤注一擲谷歌搜索來的。

這工作:

//Check this for how the url should look like : 
//https://developer.mozilla.org/en/mozIJSSubScriptLoader 
function loadScript(url) 
{ 
    var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader); 
    //The magic happens here 
    loader.loadSubScript(url); 
} 

這隻會加載本地文件,這是我需要我的應用程序。

我對Mozilla非常失望,爲什麼不以同樣的方式像html一樣以標準的方式來做到這一點?

+0

挑戰在哪裏? ;) – lucideer 2010-07-16 14:14:56

1

我已經試過這一點,我認爲你是對的 - 我似乎無法得到XUL運行動態附加script標籤 - 也許這是一個錯誤。

我很好奇你爲什麼想要雖然 - 我想不出任何情況下,人們需要這樣做 - 也許無論你試圖以另一種方式實現。爲什麼他們需要動態加載?


題外話:你對腳本所做的更改。

e.setAttribute('src',url);在普通網頁中也是有效的,實際上在技術上比e.src=url;更「正確」(儘管時間較長,並且在舊版瀏覽器中得不到很好的支持)。

類型application/javascriptapplication/ecmascript應該在正常的網頁中工作,並且比text/javascript更「正確」,但IE不支持它們,因此通常不會使用它們。

+0

問候, 我做了一些漂亮搞砸了的東西;我得到了糟糕的形成的JavaScript,加載它在XUL動態,有Firefox告訴我什麼是錯在哪個行號,我的XUL腳本分析錯誤,修復形成嚴重的JavaScript,使其更好一點,並繼續加載/修復,直到JavaScript的作品。 – tomdemuyt 2010-07-16 14:04:09

1

裏面XUL環境你只被允許使用XHR + EVAL類似如下:

function loadScript (url) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, false); // sync 
    xhr.send(null); 
    if (xhr.status && xhr.status != 200) 
     throw xhr.statusText; 
    try { 
     eval(xhr.responseText, window); 
    } catch (x) { 
     throw new Error("ERROR in loadScript: Can't load script '" + url+ "'\nError message is:" + x.message); 
    } 
}; 
相關問題