2009-10-30 1 views
1

Im работает над расширением FireFox, которое прослушивает OnStateChange. Когда текущий документ был загружен, он должен вставить скрипт на страницу, и он должен иметь возможность вызывать скрипт на событие кнопки.Расширение Firefox: Добавить javascript на веб-страницу

Теперь я могу добавить кнопку для всех веб-страниц с помощью:

nsCOMPtr<nsIDOMElement> NewInputElementTest; 
rv = htmlDoc->CreateElement(NS_LITERAL_STRING("input"),getter_AddRefs(NewInputElementTest)); 

rv = NewInputElementTest->SetAttribute(NS_LITERAL_STRING("type"),NS_LITERAL_STRING("button")); 

rv = NewInputElementTest->SetAttribute(NS_LITERAL_STRING("value"),NS_LITERAL_STRING("hummer")); 

rv = body->AppendChild(NewInputElementTest,getter_AddRefs(AddedNewInputElement2)); 

The button is displayed correctly. 


I wish to use the same procedure to add a SCRIPT to the page, like so: 

rv = htmlDoc->CreateElement(NS_LITERAL_STRING("script"),getter_AddRefs(NewInputElement)); 
rv = NewInputElement->SetAttribute(NS_LITERAL_STRING("type"),NS_LITERAL_STRING("text/javascript")); 
rv = NewInputElement->SetAttribute(NS_LITERAL_STRING("text"),NS_LITERAL_STRING("alert('hello world!')")); 
rv = body->AppendChild(NewInputElement,getter_AddRefs(AddedNewInputElement)); 

Все функции возвращают успех, но ни один скрипт не будет добавлен на страницу. Предупреждение не отображается, и если я вставляю функцию и вызываю ее из кнопки button.onclick, тогда журнал FireFox показывает, что функция недоступна.

Если я использую ту же самую процедуру из javascript внутри html-страницы, то она работает, и появляется предупреждение.

Нужно ли мне что-либо делать, чтобы включить сценарий из моего расширения или почему сценарий недоступен с помощью кнопки или где-либо еще?

Благодаря

+0

возможно дубликат [Как внедрить JavaScript в страницу, с Firefox, дополнения, и запустить его?] (Http://stackoverflow.com/questions/2879669/how-to-inject-javascript- in-page-from-a-firefox-add-on-and-run-it) – user2284570

ответ

2

Я не хочу сказать это после того, как вы создали кучу кода, но проверить Greasemonkey: https://addons.mozilla.org/en-US/firefox/addon/748

Это, вероятно, обрабатывать много вашей работы для вас.

+0

Кажется, что использование greasemonkey потребует, чтобы этот аддон уже был установлен. Невозможно добавить мой собственный скрипт с помощью уже загруженного аддона? – elnino

+0

@OrenMazor: ** Мне очень не нравится идея greasmonkey. ** Сценарий загружается только при завершении загрузки страницы. На многих сайтах загрузка страницы никогда не может закончиться, поэтому сценарий никогда не запускается * (это дизайн greasmonkey) *. Важно поставить больше *** зернистого управления *** и людей Opera [понял это] (http://www.opera.com/docs/userjs/examples/#loadingscripts) в прошлом * (Они больше не делают) *. Пользователи могут действительно разозлиться, если им нужно подождать до 50 минут. – user2284570

1

Да, звучит так, будто вы пытаетесь изобрести колесо. Используйте Greasemonkey, как предложил Орен.

Вот сценарий Greasemonkey, который я использую для загрузки внешней инфраструктуры JS (Prototype и Scriptaculous в этом случае), загружает любое количество внешних файлов (js и css) на страницу.

// ==UserScript== 
// @name   External Loader 
// @namespace  http://ifelse.org 
// @description Loads external JS and CSS 
// @include  http://*.yoursitedomainetc.com/* 
// ==/UserScript== 

var hasPrototype = ('Prototype' in unsafeWindow); 
var hasEffects = ('Effect' in unsafeWindow); 

function _require(url, isCSS) { 
    if (isCSS) { 
     var script = document.createElement('link'); 
     script.setAttribute('type', 'text/css'); 
     script.setAttribute('rel', 'stylesheet'); 
     script.setAttribute('href', url); 
    } else { 
     var script = document.createElement('script'); 
     script.setAttribute('type', 'text/javascript'); 
     script.setAttribute('charset', 'UTF-8'); 
     script.src = url; 
    } 
    document.getElementsByTagName('head')[0].appendChild(script); 
} 

// Load prototype; shouldn't get here because it is already on the page 
if (!hasPrototype) { 
    _require('http://path.com/to/prototype/1.6.0.2/prototype.js'); 
} 

// Load scriptaculous effects if it's not already loaded 
if (!hasEffects) { 
    _require('http://path.com/to/scriptaculous/1.8.1/effects.js'); 
} 

// Add greasemonkey ajax object 
// Copies format of Prototype Ajax.Request to 
// Allow to easily swap out at a later point (i.e. no longer FF plugin) 
unsafeWindow.Remote = new Object; 
unsafeWindow.Remote.Ajax = function(url, options) { 
    if (options.onCreate) { 
     options["onCreate"](); 
    } 

    var request = { 
     method: options.method || 'get', 
     url: url + ('?' + unsafeWindow.Object.toQueryString(options.parameters) || ''), 
     onload: function(response) { 
      if (response.status == 200) 
      options["onComplete"](response); 
      options["onSuccess"](); 
     }, 
     onerror: options.onFailure || null 
    }; 
    window.setTimeout(GM_xmlhttpRequest, 0, request); 
}; 

// Load these External files 
_require('http://path/to/anything/and/dont/cache/it.js' + '?cache=' + (new Date()).getTime()); 
_require('http://paht/to/something/else.css', true); 
} 
+0

Спасибо за помощь. Я новичок в этом, возможно, вы можете помочь мне дальше. Мне нужно загрузить скрипт из другого приложения или скрипт, расположенный на диске, а не с URL-адресом, это проблема? Также есть ли у пользователей моего приложения/скрипта наличие greasemonkey заранее? Вложенный сценарий, где я могу его загрузить, когда какая-либо страница будет загружена? Немного больше деталей для новичка было бы здорово :) Я проверю greasemonekey тем временем :) Спасибо. – elnino

+0

Если вам известен конкретный сценарий или код для включения и не нужно загружать его удаленно, вы можете заменить сценарий выше своим содержимым и запустить его. Пользователям обычно необходимо установить greasemonkey и скрипт для запуска, но вы также можете скомпилировать сценарии greasemonkey в плагинах Firefox. http://arantius.com/misc/greasemonkey/script-compiler – donohoe

+0

Итак, позвольте мне понять это прямо. Мне нужно создать расширение, которое будет загружать файл, т.е. c: \ myscript.js и вставьте этот скрипт на любую веб-страницу, которую посещает FireFox. Можно ли создать сценарий GreaseMonkey и скомпилировать его в файл xpi? И как только у меня есть файл xpi, что мне с ним делать? Спасибо. – elnino