2015-05-26 12 views
7

Ho un'estensione, funzionante su Chrome, che controlla la scheda attiva per le modifiche dell'URL.Rileva scheda Modifica URL all'interno di un componente aggiuntivo di Firefox

In particolare, devo rilevare quando l'URL cambia, ma non vi è alcun caricamento o navigazione della nuova pagina. Alcuni siti eseguono questa operazione (ad esempio quando fai clic per visualizzare un altro video su YouTube).

Su Chrome, ho compiuto questo con:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if (changeInfo && changeInfo.status == "complete") { 
     //do stuff here 
    } 
}); 

Come faccio a rilevare tali cambiamenti in un add-on Firefox?

Mi è stato detto di usare: Listening to events on all tabs, ma non riuscivo a metterlo insieme. Uno dei problemi era che gBrowser non era definito nell'estensione.

Cosa sto sbagliando?

C'è un modo più semplice?

+0

nsIWebProgressListener - https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebProgressListener?redirectlocale=en-US&redirectslug=nsIWebProgressListener#onStatusChange % 28% 29 - l'ho usato qui: https://github.com/Noitidart/Listen-on-Repeat-Youtube-Video-Repeater – Noitidart

+1

thx @Noitidart Questo sembra così eccessivamente complesso per un compito così semplice, ma ok , ho definito l'ascoltatore, come posso collegarlo usando il firefox-addon sdk? non posso fare solo: gBrowser.addProgressListener (progListener); perché non ho accesso ai gBrowser, ho cercato di utilizzare la scheda/utils e fare questo: 'tabs.on ('pronto', la funzione (tab) {var browser = gBrowser.getBrowserForTab (scheda); browser .addProgressListener (progListener); ' ma il browser non è definito – tiagosilva

+0

Non ho molta familiarità con sdk. Il motivo per cui è complesso fornisce molte informazioni importanti su cosa ha causato il cambiamento e perché. Se vuoi semplicemente ascoltare il cambiamento, puoi probabilmente usare un MutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver?redirectlocale=en-US&redirectslug=DOM%2FMutationObserver#MutationObserverInit use 'characterData 'e guarda sull'elemento anonimo altrimenti non si innescherà. penso che l'osservatore si disconnetterà dal cambio delle schede, anche se non sono sicuro. https://ask.mozilla.org/question/542/mutation-observer-disconnects-from-anonymous-element – Noitidart

risposta

4

Utilizzare ProgressListener per ricevere notifiche sui cambiamenti di posizione.

Per installare un listener, convertire la scheda SDK nella sua rappresentazione grezza (vecchia) utilizzando viewFor. La conversione a ritroso è possibile con modelFor e 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); 
}); 

Non dimenticare di rimuovere i listener sullo scaricamento dell'estensione. I listener di schede vengono rimossi automaticamente, ma ProgressListeners non lo sarà.

Ispirato Converting to chrome windows

+1

Soluzione molto bella e semplice, grazie! Un commento però, non dobbiamo allegare questo listener su ogni scheda aperta. Solo una volta per finestra del browser. – Noitidart

+0

Fonte: https://github.com/mozilla/addon-sdk/blob/master/lib/sdk/content/page-worker.js#L101-L120 – mate64

+0

Questa risposta è ora obsoleta. Firefox depreca le API di Chrome in favore di WebExtensions. – Basilevs

0

Se si sta utilizzando l'SDK aggiuntivo, si stanno esaminando i documenti errati. Ecco lo tab docs.

Come detto lì, si crea un ascoltatore in questo modo:

var tabs = require("sdk/tabs"); 

// Listen for tab openings. 
tabs.on('open', function onOpen(tab) { 
    myOpenTabs.push(tab); 
}); 

// Listen for tab content loads. 
tabs.on('ready', function(tab) { 
    console.log('tab is loaded', tab.title, tab.url); 
}); 

Tutti i documenti si guarda dovrebbe essere un sottoinsieme di developer.mozilla.org/en-US/Add-ons/SDK.

+2

tabs.on ('ready' ... non attiva quando si ricevono nuovi contenuti tramite ajax, – tiagosilva

0

Trovo che gli eventi activate e pageshow, tra i due, coprano tutte le modifiche nell'URL che posso evocare tra passare da una scheda all'altra, aprire pagine in una nuova scheda, chiudere schede, aggiornare pagine e digitare in una nuova URL.

var updateURL = function (tab) { 
var oldURL = url; 
var url = tab.url; 
console.log(url); 
}; 

tabs.on("activate", updateURL); 
tabs.on("pageshow", updateURL); 
+0

Si prega di [modificare] in una spiegazione del motivo/come questo codice risponde alla domanda. solo le risposte sono scoraggiate, perché non sono così facili da imparare come codice con una spiegazione: senza una spiegazione ci vuole molto più tempo e sforzo per capire cosa viene fatto, le modifiche apportate al codice, se il codice risponde alla domanda ecc. La spiegazione è importante sia per le persone che cercano di imparare dalla risposta sia per coloro che valutano la risposta per vedere se è valida, o vale la pena di votare – Makyen

+2

ho detto nella mia domanda: "l'URL è cambiato ma non c'era una nuova pagina annuncio o navigazione ", nessuno dei tuoi esempi: (copre tutti i cambiamenti nell'URL che posso evocare tra passare da una tabulazione all'altra, aprire pagine in una nuova scheda, chiudere schede, aggiornare pagine e digitare nuovi URL.) Coprire il mio esempio: (come su youtube quando si fa clic per visualizzare un altro video) – tiagosilva

Problemi correlati