2016-05-03 23 views
1

Vorhin I ID des erstellten Artikel für das Kontextmenü in Google Chrome-Erweiterungen retten könnte:Überprüfen Sie, ob Artikel ist bereits im Kontextmenü

background.js:

var myItem; 

if (myItem !== "MyItem") { 
    myItem = chrome.contextMenus.create({ 
     title: "My item", 
     id: 'MyItem', 
     contexts: ["page"] 
    }); 
} 

Aber wenn ich jetzt Chrome zum ersten Mal öffnen, sagt es:

Ungeprüfter runtime.lastError während contextMenus.create ausgeführt wird: Kann nicht erstellen Artikel mit doppeltem ID MyItem

(von Debug-Konsole)

So ist es nicht meine Variable "myItem" erinnern (seine Daten) mehr als ich Chrome schließen. Es merkt sich nur, während Chrome geöffnet ist.

Also jetzt sollte ich chrome.storage.local.get oder set verwenden, um die ID meiner Kontext Menü Elemente zu speichern?

Update:

Das Problem für den Hintergrund ein "persistent": false in manifest wurde:

"background": { 
     "scripts": [ "background.js" ] 
    }, 

es entfernt & jetzt funktioniert es normalerweise [gelöst]

Antwort

1

lokalen Speicher ist definitiv ein Möglichkeit.

Obwohl eine weitere Option zu removeAll ist vor dem Erstellen: -

chrome.contextMenus.removeAll(function() { 
    chrome.contextMenus.create({ 
    title: "My item", 
    id: 'MyItem', 
    contexts: ["page"] 
    }); 
}); 

ich auf diese Weise verwendet wird, wenn ich dynamische Submenüs hatte, usw. und fand es viel einfacher, das ganze Menü zu erstellen als zu bestimmen, um zu versuchen, die Optionen sollten hinzugefügt/entfernt werden.

+1

'removeAll' ist asynchron. Ich muss diese verketten. – Xan

+0

komplett vergessen. Danke für die Aufforderung. – BenG

0

Sie beachten Sie, dass es immer sicher ist, ein Kontextmenü zu entfernen-then-hinzufügen:

// Or removeAll and create all 
chrome.contextMenus.remove('MyItem', function() { 
    chrome.contextMenus.create({ 
    title: "My item", 
    id: 'MyItem', 
    contexts: ["page"] 
    }); 
}); 

Es gibt keine Notwendigkeit, das Ergebnis dieser Operation zu speichern; und Sie müssen es nicht häufig aufrufen, da das Kontextmenü zwischen den Neustarts in Chrome beibehalten wird.

Mit einem Listener zu chrome.runtime.onInstalled und diese Operation dort wird außer one corner case großartig funktionieren.

+0

Ich fand heraus, warum es begann, diesen Fehler zu zeigen - ich setze "persistent": false für Hintergrund in meinem Manifest einmal. _Es ist nicht notwendig, das Ergebnis_ zu speichern - ja, Sie haben Recht, aber in meinem Fall sind meine Elemente optional (Benutzer können es in Erweiterungseinstellungen aktivieren/deaktivieren) und dort einige Bedingungen, wenn ein Element nicht angezeigt werden sollte, wenn Sekunde für zB aktiviert ist : 'if (... && myItem2! =" MyItem2 ") {... create ...}' – user25

+0

Das Schließen des Browsers löscht immer noch den Status Ihres Hintergrunds, dauerhaft oder nicht. Sie sollten 'chrome.storage' verwenden, um Benutzereinstellungen zu speichern. Aber lesen Sie zuerst die [Event pages] (https://developer.chrome.com/extensions/event_pages) -Dokumente aufmerksam durch. – Xan

+0

_still wischen Sie den Hintergrund Ihres Hintergrunds_ mb, aber wenn es wahr ist, gibt es keinen Fehler nach dem Neustart des Browsers. Eigentlich gibt es nichts zu befürchten, wenn ich diesen Fehler sehen oder nicht beim Debuggen, würde die Erweiterung noch arbeiten, wie ich will (Chrome ist nicht viele Elemente im Kontextmenü mit der gleichen ID erstellen gehen sowieso). – user25

Verwandte Themen