#javascript #firefox-addon #firefox-addon-sdk
#javascript #firefox-дополнение #firefox-addon-sdk
Вопрос:
Я получил задание написать дополнение для Firefox, которое добавит элемент div на существующую страницу. Я скачал дополнительный SDK и написал main.js
файл, который выглядит следующим образом:
var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);
function ExecuteAd(tab) {
if ( tab.url.indexOf("some url checking") > -1 ) {
var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
var link = "http://www.google.me";
tab.attach({
contentScriptFile: data.url("myscript.js"),
contentScript: "appendFunc('" image "', '" link "');"
//contentScript: "alert('Works');"
});
}
}
Когда я выполняю команду cfx run
, запускается Firefox, и если я перехожу на определенные веб-страницы, этот скрипт работает. Но когда я создаю файл XPI с помощью cfx xpi
, а затем нажимаю на Firefox и открываю этот файл, он устанавливает мое дополнение, но теперь, когда я захожу на те же веб-страницы, которые я указал ранее, дополнение не работает. У меня есть этот внешний файл Javascript, который хранится в папке ‘data’.
appendFunc
находится в myscript.js
файле.
Как заставить мое расширение работать в производственной среде, а не только в среде тестирования? Я думаю, что основная проблема заключается в том, что он не находит это data/myscript.js (включено ли это в файл .xpi?)
Комментарии:
1. Если вы не хотите пробовать что-то другое, кроме дополнительного sdk. Вот шаблон, который поможет вам со стилем начальной загрузки: GitHubGist :: Noitidart / watchPage …
Ответ №1:
Не смешивайте contentScript
и contentScriptFile
. Кроме того, вы не можете знать, какой из обоих загружается первым.
Вместо этого загрузите свой скрипт и общайтесь с помощью port
.
main.js
var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);
function ExecuteAd(tab) {
var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
var link = "http://www.google.me";
var worker = tab.attach({
contentScriptFile: data.url("myscript.js")
});
worker.port.emit("showAd", {image: image, link: link});
}
myscript.js
self.port.on("showAd", function(data) {
console.log("showing ad", data.link, data.image);
});
Кроме того, похоже, что PageMod
это был бы лучший выбор для того, что вы делаете.
PS: Также ознакомьтесь с Политиками дополнительных приложений, если вы планируете размещать на addons.mozilla.org веб-сайт. Политики, например, запрещают вставлять объявления, которые а) четко не помечены как таковые и б) в которых пользователь не зарегистрировался до этого.
Комментарии:
1. Это не работает с использованием связи портов в среде разработки. Я также пробовал использовать тот же метод с помощью PageMod, но он не работает в среде разработки.
2. Я не могу догадаться, что сломано в вашем коде. Я протестировал свой, и он работает с использованием
cfx run
иcfx xpi
. Поэтому, пожалуйста, отправьте дополнительный вопрос с подробным описанием вашего кода, что именно не работает и сообщений об ошибках (или, если это все еще вписывается в рамки этого вопроса, обновите свой вопрос и дайте мне знать).