2010-01-13 1 views
2

Мне нужно его использовать в моем расширении Firefox. Я уже пробовал window.onload прослушиватель событий и проверяю, действительно ли текущий url == старый url, и это хорошая идея, но он не работает, когда страница загружает pdf.Как проверить, изменился ли URL текущей вкладки браузера?

Я видел, что хеш тоже менял функцию, но работает только с ff 3.6; Мне нужно, чтобы он работал хотя бы с ff 3.

Итак, мне нужен прослушиватель событий, который проверяет, меняется ли document.location.

Благодаря

ответ

2

Например, вы могли бы использовать:

var mainWindow = window 
    .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIWebNavigation) 
    .QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem 
    .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIDOMWindow); 

mainWindow.getBrowser().addEventListener("DOMContentLoaded", 
         your_function, false); 

Но, дело в том, что вам нужно добавить слушателя в браузер, а не окна.

EDIT
См https://developer.mozilla.org/En/Code_snippets/Tabbed_browser для получения информации о доступе к веб-браузер из разных контекстов, а также некоторые другие полезные данные.

EDIT
Просто, чтобы добавить немного больше деталей ....

function your_function(event) { 
    if (event.originalTarget instanceof HTMLDocument) { 
    var doc = event.originalTarget; 
     // if it's just a frame element, then return and wait for the 
     // main event to fire. 
     if (event.originalTarget.defaultView.frameElement) 
      return; 

     // now you can use doc.location however you want 
    } 
} 

Обратите внимание, что это будет реагировать на страницы открыты в любой вкладке, а не вкладка специфичны.


Для конкретной вкладки, вы можете использовать что-то вроде этого:

var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.addTab("http://www.google.com/")); 
newTabBrowser.addEventListener("load", function() { 
    newTabBrowser.contentDocument.body.innerHTML = "<div>hello world</div>"; 
}, true); 

выше добавляет новую вкладку, а затем добавляет слушатель. Однако для всех вкладок вам потребуется что-то вроде следующего. Затем добавьте прослушиватель событий «DOMContentLoaded» на каждой вкладке при добавлении (и удалите при закрытии).

Вы также можете посмотреть: https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed и https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Getting_document_of_currently_selected_tab

(для сохранения)

function exampleTabAdded(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been added 
} 

function exampleTabMoved(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been moved 
} 

function exampleTabRemoved(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been removed 
} 

// During initialisation 
var container = gBrowser.tabContainer; 
container.addEventListener("TabOpen", exampleTabAdded, false); 
container.addEventListener("TabMove", exampleTabMoved, false); 
container.addEventListener("TabClose", exampleTabRemoved, false); 

// When no longer needed 
container.removeEventListener("TabOpen", exampleTabAdded, false); 
container.removeEventListener("TabMove", exampleTabMoved, false); 
container.removeEventListener("TabClose", exampleTabRemoved, false); 

Это вы должны получить 99% пути.

+0

Спасибо Джонатан. Функция, которую вы написали, кажется правильной, но проблема в том, что при загрузке pdf событие DOMContentLoaded не срабатывает, поэтому ни остальная часть кода ... Лучшим решением должно быть добавление eventListener к некоторому элементу браузера, который управляет URL-адресом, но я понятия не имею, как –

+1

событие DOMContentLoaded запускается только для типов MIME, имеющих DOM (например,HTML, или XUL). Вы специально хотите слушать загружаемый PDF-файл? из определенного домена? Вы можете посмотреть https://developer.mozilla.org/en/Observer_Notifications и, в частности, 'http-on-study-response'. А также см. Http://www.ashita.org/howto-xhr-listening-by-a-firefox-addon/ для примера обработки уведомлений наблюдателя. –

+0

Спасибо, Джонатан, вы меня поймаете правильно. Теперь с http-on-study-response я могу получить события из запроса страницы и проверить, изменился ли URL-адрес страницы, и, конечно же, он работает также с pdf. Но я должен проверить историю и назад, потому что они не делают HTTP-запрос. Действительно, нет другого способа проверить только событие запроса страницы, например. событие, которое должно быть уволено, когда я пишу url на моем firefox navbar и нажмите enter ?! –

3

Добавить Progress Listener и отслеживать изменения местоположения внутри вкладки. Накройте вкладки с помощью Addon SDK.

Чтобы установить слушателя, конвертируйте вкладку SDK в исходное (старое) представление с помощью viewFor. Обратное преобразование возможен с помощью моделиFor и getTabForContentWindow.

const tabs = require("sdk/tabs"); 
const {viewFor} = require('sdk/view/core'); 
const {modelFor} = require('sdk/model/core'); 
const {getBrowserForTab, getTabForContentWindow} = require("sdk/tabs/utils"); 
const {Ci, Cu} = require("chrome"); 
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); 

var progressListener = { 
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), 
    onLocationChange: function(aProgress, aRequest, aURI) { 
     var highLevel= modelFor(getTabForContentWindow(aProgress.DOMWindow)); 
     console.log("onLocationChange ", highLevel.url); 
    } 
}; 

tabs.on('open', function(newTab) { 
    var lowLevel = viewFor(newTab); 
    var browser = getBrowserForTab(lowLevel); 
    browser.addProgressListener(progressListener); 
}); 

Вдохновленный Converting to chrome windows