Событие перед «загрузкой» для расширения Firefox? - PullRequest
3 голосов
/ 16 марта 2011

Я пишу расширение Firefox,

Это мой XUL (нет проблем)

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE overlay SYSTEM "chrome://locale/myDtd.dtd">
<page id="overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <script type="application/x-javascript" src="chrome://addon/content/test.js" />
</page>

А вот проблемная часть Javascript test.js

window.addEventListener("load",
    function(event) {
        var appcontent = window.document.getElementById("appcontent");
        appcontent.addEventListener("load",onEventLoad,true);
    }, true);

Второй слушатель load для appcontent слишком медленный для моих нужд.Событие 'load' запускается, когда DOM завершает загрузку.

Мой вопрос: Кто-нибудь знает, как запустить код, как только документ начинает загружаться (до загрузкисобытие из DOM)?(если бы существовало событие onBeforeLoad или onRequestStart)

В расширениях Chrome мы можем использовать «run_at»: «document_start» в «manifest.json», а в расширениях Safari мы можем использовать «Запуск сценария» в расширениистроитель, но в Firefox ... я не знаю, как сделать тот же трюк.

Мне нужно это, чтобы начать смотреть на элементы в DOM, как только они появятся (но это другая история).

Я ценю любую помощь.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Здесь есть хорошее объяснение:

http://blog.webmynd.com/2011/04/04/equivalent-to-beforeload-event-for-firefox-extensions/

Предлагаемое решение опирается на Firefox Observers и http-on-modify-request:

Components.classes["@mozilla.org/observer-service;1"]
  .getService(Components.interfaces.nsIObserverService)
  .addObserver({
    observe: function(aSubject, aTopic, aData) {
      if ("http-on-modify-request" == aTopic) {
        var url = aSubject
          .QueryInterface(Components.interfaces.nsIHttpChannel)
          .originalURI.spec;
        if (url && url.match('facebook')) {
          aSubject.cancel(Components.results.NS_BINDING_SUCCEEDED);
        }
    }
  }
}, "http-on-modify-request", false);
0 голосов
/ 18 марта 2011

Вы устанавливаете src вашего элемента appcontent как атрибут в исходном коде XUL?Это усложняет задачу, поскольку XUL не нравится, когда вы получаете доступ к элементам во время загрузки.Что вы можете попробовать, так это добавить производную XBL-привязку к элементу и определить там обработчик события захвата.Или вы можете обнаружить, что событие DOMContentLoaded достаточно рано.В противном случае я бы предложил оставить элемент appcontent пустым и загружать его только после того, как вы добавили обработчик событий загрузки в обработчик событий загрузки главного окна.

0 голосов
/ 16 марта 2011

Можете ли вы взять var appcontent = window.document.getElementById("appcontent"); из обработчика событий и выполнить setInterval, пока он не увидит, что элемент DOM заполнен?

init();

function init(){
    var intval = setInterval ( "checkForElement()", 200 );
}

function checkForElement(){
    if (document.getElementById('appcontent') != 'undefined'){
        clearInterval(intval);
        var appcontent = window.document.getElementById("appcontent");
        appcontent.addEventListener("load",onEventLoad,true);
    }
}

Возможно, вам придется выполнить некоторую отладку alert(document.getElementById('appcontent'));, чтобы увидеть, обрабатывает ли каждый браузер одинаковый элемент.

...