2017-09-29 1 views
1

Ich entwickle eine Chrome-Erweiterung, die ein Popup auf bestimmten Domänen anzeigen. Das Popup sollte jedes Mal angezeigt werden, wenn der Benutzer die Webseite besucht oder die aktuelle Seite mit einer der Zieldomänen aktualisiert. so zuerst habe ich ein Zuhörer geputtet, wenn der aktuelle Tab aktualisiert:erkennen, wenn Benutzer eine Seite aktualisieren

chrome.runtime.onInstalled.addListener(function() { 
    chrome.tabs.onUpdated.addListener(onTabUpdate); 
}); 

die onTabUpdate Funktion jedes Mal ausgeführt werden sollen wird eine Seite geladen (ich einige unnötige Code wie Domains Test gelöscht haben):

function onTabUpdate(tabId, info, tab) { 
//if page is refreshed 
if (info.url === undefined) { 
    if (info.status == 'loading') { 
     console.log('Refresh happened for tab: ' + tabId) 
     tabsLoaded = {}; 
     loadPopup(tabId); 
    } 
} 
//if page is first time loaded 
if (tab.status !== 'complete') { 
    return; 
} else { 
    console.log("page loaded "); 
    loadPopup(tabId); 

}} 

der Code läuft sehr gut und erkennen, wenn die Seite geladen oder aktualisiert wird, ist das Problem, dass, wenn ich das Popup anzeigen und der Benutzer es schließen, das Refresh-Ereignis ausgelöst wird und das Popup erneut angezeigt wird. Ich denke, weil Chrome das DOM neu zeichnet und die Seite aktualisiert. So suche ich Weg, um zu erkennen, wenn der Benutzer ihn selbst aktualisieren Sie die Seite nicht, wenn Chrom tut.

Antwort

0

Ich habe einen Hack gefunden, um es zu tun. Ich denke nicht, dass es eine Möglichkeit gibt, dies über die native Chrome-API zu tun. einen Content-Skript in jedes Register injizieren, die erkennen, wann immer der Benutzer die Seite neu geladen und eine Nachricht senden:

if (performance.navigation.type == 1) { 
    chrome.runtime.sendMessage("your_extension_id", "pageRefreshed"); 
} 

dann einem Setup einen Zuhörer im Hintergrund Skript, diese Nachricht zu fangen:

chrome.runtime.onMessage.addListener(function (e, sender) { 
     if (e == "pageRefreshed") { 
      var hostName = extractHostname(sender.tab.url); 
      if (partnersList.some(function (el) { 
        return hostName.indexOf(el) !== -1; 
       })) { 
       loadPopup(sender.tab.id); 
      } 
     } 
    }); 

und voila! Problem gelöst :)

Verwandte Themen