Выполнить JS из расширения Firefox - PullRequest
5 голосов
/ 05 июня 2011

Я пытаюсь выполнить пользовательский код JS из расширения Firefox, используя:

function executeJS(document, script) {
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.appendChild(document.createTextNode(script));
    document.getElementsByTagName('head')[0].appendChild(script);
}

Вызов метода выглядит так:

executeJS(content.document, "$('#" + this.id + "').jixedbar({showOnTop:true});");

И вот результат, который я получаю:

<script type="text/javascript">
    [object XPCNativeWrapper [object HTMLScriptElement]]
</script>

Что не так с моим кодом? Как правильно выполнить произвольный JS-скрипт из расширения Firefox?

1 Ответ

3 голосов
/ 05 июня 2011

Я не уверен насчет расширений FF, но в «обычной» JS-стране нет необходимости в createTextNode бизнесе.Помимо расширений FF, вы можете использовать Node.textContent - хотя, возможно, он отличается от типов XPCNativeWrapper.

script.textContent = 'var foo = 1; alert(foo);'

Я думаю, что проблема main ,однако, вы также получили переменную и параметр с именем script.Попробуйте это:

function executeJS(document, scriptContent) {
    var script = document.createElement('script');
    script.appendChild(document.createTextNode(scriptContent));
    document.head.appendChild(script);
}

Атрибут type действительно не нужен, кстати.


Я только что натолкнулся на эту страницу , которая выглядит такможет быть то, что вы ищете:

const XUL = Namespace("xul", "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

function injectScript(name) {
    // Get the current filename
    let file = Components.stack.filename;
    // Strip off any prefixes added by the sub-script loader
    // and the trailing filename
    let directory = file.replace(/.* -> |[^\/]+$/g, "");

    // Create the script node
    let script = document.createElementNS(XUL, "script");
    script.setAttribute("type", "application/javascript;version=1.8");
    script.setAttribute("src", directory + name);

    // Inject it into the top-level element of the document
    document.documentElement.appendChild(script);
}

// Inject the script
injectScript("script.js");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...