2012-03-12 2 views
0

Я создаю надстройку, которая использует браузер overlay.xul, в который включены js-файлы. Самый простой способ, которым я нашел изменение HTML на веб-странице, - это тот код, который я нашел на mdn, я считаю.Вставка html на лету и вкладки

const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; 
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; 

var myListener = { 
    QueryInterface: function(aIID) { 
     if (aIID.equals(Components.interfaces.nsIWebProgressListener) || 
     aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
     aIID.equals(Components.interfaces.nsISupports)) 
     return this; 
     throw Components.results.NS_NOINTERFACE; 
    }, 
    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { }, 
    onLocationChange: function(aProgress, aRequest, aURI) { 
     PageLoad.initialzed = false; 
     PageLoad.init(); 
    }, 
    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { }, 
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { }, 
    onSecurityChange: function(aWebProgress, aRequest, aState) { } 
}; 

gBrowser.addProgressListener(myListener); 


var PageLoad = { 
    initialzed : false, 
    browser : null, 
    domain : null, 
    appcontent : null, 

    init : function() { 
     PageLoad.appcontent = document.getElementById("appcontent"); 
     if (PageLoad.appcontent) { 
      PageLoad.appcontent.addEventListener("DOMContentLoaded", PageLoad.load, true); 
     } 
    }, 
    load : function() { 
       //I do this so it only calls the function once 
     if (PageLoad.initialzed == false) { 
      PageLoad.initialzed = true; 
      PageLoad.browser = gBrowser.contentDocument; 
      PageLoad.domain = (PageLoad.browser.location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1]; 
      myFunctiontoInsertHTML(); 
     } 

    } 
}; 

Тогда я могу использовать PageLoad.browser.createElement('div') и так далее в моей функции .. Это работает хорошо до сих пор, но я столкнулся с проблемой, что с несколькими открытыми вкладками, моя PageLoad.domain переменный содержит домен последней вкладки загруженной или веб-страницу (которая, в свою очередь, вызывает ошибки, вставляя html на 2 или более разных страницах/вкладках). Поэтому я хочу изменить каждый раз, когда пользователь нажимает на другую вкладку или перезагружает страницу, которую я хочу вызвать, но я столкнулся с тупиком.

+1

проверить [на странице load] (https://developer.mozilla.org/en/Code_snippets/On_page_load) и [url bar listner] (https://developer.mozilla.org/en/Code_snippets/Progress_Listeners# Пример: _Notification_when_the_value_in_Address_Bar_changes) –

+0

Я использовал свою собственную вариацию этой ссылки «на странице», но этот слушатель строки url именно то, что мне нужно, я думаю. – thefoyer

ответ

0

gBrowser.contentDocument - это документ страницы, загруженной в текущую вкладку браузера, - как только пользователь переключит вкладки или перейдет на другую страницу, ее значение изменится, и вы не должны сохранять старое значение (это утечка памяти) , Вы наблюдаете за ходом всех вкладок браузера, вы должны посмотреть на тот, который вам вызвали. Значение в вашем случае: aProgress.DOMWindow (см. nsIWebProgress.DOMWindow). Кроме того, вы должны приложить свой прослушиватель событий DOMContentLoaded, если вас интересует ход загрузки одной вкладки.

+0

Спасибо Владимиру за вашу помощь. Кажется, что я столкнулся с большей проблемой с 'gBrowser.addProgressListener'. Как ни странно, после установки аддона он работает. Если я закрою свой браузер и снова запустил его, аддон снова работает, как и ожидалось, однако, если я снова закрою браузер и открою его, это не сработает. Глядя в консоль ошибок, он говорит, что «' gBrowser.addProgressListener »не является функцией». Аддон не будет работать, пока я его не переустановит. Прополощите и повторите, если вы перезапустите браузер 3 раза, он больше не работает. – thefoyer

Смежные вопросы