Как загрузить скрипт в приложение XUL после начальной загрузки - PullRequest
0 голосов
/ 16 июля 2010

Привет,

моему приложению 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 ]

3 голосов
/ 16 июля 2010

Хорошо,

, как обычно, всякий раз, когда я публикую сообщения о переполнении стека, ответ будет приходить довольно скоро через последний отчаянный поиск в 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 голос
/ 23 апреля 2012

В среде 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);
    }
};
1 голос
/ 16 июля 2010

Я пробовал это, и я думаю, что вы правы - я не могу заставить XUL запускать динамически добавленные теги скриптов - возможно, это ошибка.

Мне интересно, почемуВы хотели бы, хотя - я не могу представить ни одной ситуации, когда нужно было бы делать это - возможно, то, что вы пытаетесь, могло бы быть достигнуто другим способом.Почему они должны быть динамически загружены?


Не по теме: для изменений, которые вы внесли в скрипт.

e.setAttribute('src',url); действительно внормальные веб-страницы, и на самом деле технически более "правильные", чем e.src=url; в любом случае (хотя в старых браузерах они длиннее и не очень хорошо поддерживаются).

Типы application/javascript или application/ecmascript должны работать в обычном режимевеб-страницы и являются более «правильными», чем text/javascript, но IE не поддерживает их, поэтому они обычно не используются.

...