如何将脚本加载到XUL应用程序的初始加载后

问题描述:

问候,如何将脚本加载到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.

好吧,

像往常一样,每当我张贴在堆栈溢出,答案将很快直通一个孤注一掷谷歌搜索来的。

这工作:

//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

我已经试过这一点,我认为你是对的 - 我似乎无法得到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

里面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); 
    } 
};