2016-06-09 27 views
6

C'è un modo per un ServiceWorker (o altro meccanismo) per rilevare quando si scaricano risorse?JavaScript o ServiceWorkers possono rilevare attività di rete/eventi Ajax?

Per esempio, mi piacerebbe ricevere una notifica se una delle seguenti accada:

  • <img src> download
  • una risorsa in un background-image: url(...) download
  • Un foglio di stile è verificato un @import e sta raggiungendo risorse
  • <script src> download
  • Alcuni script invoca un nuovo XMLHTTPRequest o fetch

Breve hacking open the XMLHttpRequest.prototype methods, non offre JavaScript un modo per ascoltare l'attività di rete?

È un po 'l'opposto di this question about idle network activity

risposta

7

Sì, il Service Worker cattura tutti gli eventi di recupero elencati. Registrare un operaio di servizio con:

navigator.serviceWorker.register('/service-worker.js'); 

Nello script operaio di servizio, installare un gestore per l'evento fetch:

// `self` is a ServiceWorkerGlobalScope 
self.addEventListener('fetch', function(event) { 
    console.log("fetch event:", event.request.url); 
}); 

Ecco un plunker che illustra questo. Avrai bisogno di eseguire la demo due volte dall'Anteprima dal vivo (una volta per registrare il lavoratore del servizio, e di nuovo per vedere gli eventi di recupero nella console). Non dimenticare di annullare la registrazione dell'operatore di servizio da DevTools come pulizia: DevTools> Risorse/Applicazioni> Operatori di servizio (pannello a sinistra)> Elimina (a destra).

3

Sì, questo è il tipo di tutto il punto di ServiceWorker.

Limitazione di ServiceWorker (secondo le specifiche): non sarà possibile intercettare le richieste per le risorse <object> o <embed> né per le richieste di navigazione. Entrambe le restrizioni sono concepite come misure di sicurezza.

Suggerisco di iniziare a leggere nella sezione Handle Fetch delle specifiche di ServiceWorker.

+1

Grazie per la risposta, searlea. Se tu potessi mettere insieme un esempio di script o di violino che mostri un'implementazione di parte della mia domanda, sarei felice di rilasciarti la taglia. – Bryce