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

时间:2010-07-15 20:18:49

标签: javascript dynamic 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); 
}

脚本标记被正确添加,属性看起来很好,但它根本不起作用,这些加载的脚本中的代码不会被执行甚至解析。

任何人都可以暗示可能会发生什么吗?

吨。

3 个答案:

答案 0 :(得分:3)

好的,

像往常一样,每当我发布堆栈溢出时,答案将很快通过最后一次绝望的Google搜索。

这有效:

//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一样这样做呢?

答案 1 :(得分:1)

我试过这个,我认为你是对的 - 我似乎无法让XUL运行动态附加的脚本标签 - 也许这是一个错误。

我很好奇为什么你会这么想 - 我想不出任何人需要这样做的情况 - 也许你正在尝试的任何事情都可以通过另一种方式实现。为什么需要动态加载?


关于主题:关于您对脚本所做的更改。

e.setAttribute('src',url);在普通网页中也有效,并且在技术上实际上比e.src=url;更“正确”(尽管在旧浏览器中时间较长且不受支持)。

类型application/javascriptapplication/ecmascript应该在普通网页中运行,并且比text/javascript更“正确”,但IE不支持它们,因此通常不会使用它们。

答案 2 :(得分: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);
    }
};