如何将脚本加载到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一样以标准的方式来做到这一点?
我已经试过这一点,我认为你是对的 - 我似乎无法得到XUL运行动态附加script标签 - 也许这是一个错误。
我很好奇你为什么想要虽然 - 我想不出任何情况下,人们需要这样做 - 也许无论你试图以另一种方式实现。为什么他们需要动态加载?
题外话:你对脚本所做的更改。
e.setAttribute('src',url);
在普通网页中也是有效的,实际上在技术上比e.src=url;
更“正确”(尽管时间较长,并且在旧版浏览器中得不到很好的支持)。
类型application/javascript
或application/ecmascript
应该在正常的网页中工作,并且比text/javascript
更“正确”,但IE不支持它们,因此通常不会使用它们。
问候, 我做了一些漂亮搞砸了的东西;我得到了糟糕的形成的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);
}
};
挑战在哪里? ;) – lucideer 2010-07-16 14:14:56