2017-08-18 1 views
2

Ich arbeite an einem Firefox-Add-on, wo ich eine pageAction hinzufügen möchte, wenn Sie ein Video in YouTube ansehen. Mein background script funktioniert gut, bis Sie von einem YouTube-Video auf eine andere YouTube-Seite wechseln. Die pageAction verschwindet nicht. Dies ist mein Code:OnHistoryStateUpdated Filter funktioniert nicht wie erwartet

var filter = { 
    url:[ 
    { 
     pathContains: "watch", 
     hostSuffix: "youtube.com" 
    } 
    ] 
} 
function showPageAction(details) { 
    browser.pageAction.show(details.tabId); 
} 

browser.webNavigation.onCommitted.addListener(showPageAction, filter); 
browser.webNavigation.onHistoryStateUpdated.addListener(showPageAction, filter); 

Es passiert einfach das erste Mal drücken Sie irgendeinen anderen YouTube-Link von einer YouTube-Video-Seite (Geschichte, Haupt, Kanal usw.), denn wenn Sie zu einer anderen YouTube-Seite aus, dass zuerst gehen Klick, es verschwindet. Etwas wie:

  1. Neue Registerkarte öffnen
  2. Direkt zum www.youtube.com (Passt nicht angezeigt)
  3. Drücken Sie eine beliebige Video (es erscheint, wie erwartet)
  4. Drücken Sie eine beliebige andere Verbindung zu einem YouTube-Seite (Haupt, Geschichte, ein cannel) (es ist immer noch da, shoudn't verschwinden?)
  5. Drücken sie erneut eine andere Verbindung unterscheidet sich von einem Video (es verschwindet schließlich)

Ich dachte daran, einen Filter in der Funktion showPageAction hinzuzufügen, aber sollte der Filter von onHistoryStateUpdated das nicht tun?

Antwort

0

Der Filter funktioniert wie erwartet; Es ist das Standard-Reset-Verhalten, das nicht funktioniert.

Der Punkt der History State Update-basierte Navigation ist, dass keine tatsächlichen Navigation passiert (im Gegensatz zu onCommitted Ereignisse). Das heißt, FF versteckt es nicht automatisch.

Das bedeutet, dass Sie bei Navigationen, die zu nicht beobachteten Seiten führen, darauf achten müssen.

Ihre beste Wette ist innerhalb des Zuhörers zu filtern:

// Since history manipulation must preserve origin, 
// you can limit to YouTube domains for performance 
const hostFilter = { 
    url: [{hostSuffix: "youtube.com"}] 
} 

function updatePageAction(details) { 
    if (details.url.includes("watch")) { 
    browser.pageAction.show(details.tabId); 
    } else { 
    browser.pageAction.hide(details.tabId); 
    } 
} 

browser.webNavigation.onHistoryStateUpdated.addListener(
    updatePageAction, 
    hostFilter 
); 
+1

ich nicht wirklich die Erklärung erhalten hat, sorry (Englisch ist nicht meine erste Sprache). Aber der Code funktioniert wirklich gut, nur mit einer Änderung. Ich habe versucht mit enthält und es hat nicht funktioniert und nach [ONHistoryUpdate] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webNavigation/onHistoryStateUpdated) Dokumente, URL ist eine Zeichenfolge ; und es gibt keine 'contains'-Methode in string, aber' includes' hat das gleiche Ergebnis. Mit dieser Änderung brauchen Sie nicht einmal das onCommitted-Ereignis. –

Verwandte Themen