问候,
我的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);
}
脚本标记被正确添加,属性看起来很好,但它根本不起作用,这些加载的脚本中的代码不会被执行甚至解析。
任何人都可以暗示可能会发生什么吗?
吨。
答案 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/javascript
或application/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);
}
};