J'ai essayé d'enregistrer des éléments personnalisés via javascript natif et polymère à partir d'une extension chrome sans succès. Le problème est documenté ici .
Uncaught NotSupportedError: Failed to execute 'registerElement' on 'Document': Registration failed for type 'polymer-element'. Elements cannot be registered from extensions.
Je recherche des suggestions pour l'utilisation de composants Web dans une extension - quelqu'un l'a-t-il fait? Mon instinct est d'enregistrer ces éléments en utilisant des balises html standard (div, etc ...) sur le shadow DOM pour le moment jusqu'à ce qu'il soit pris en charge. Aucune suggestion?
C'est en effet possible. Mais, un peu hacky.
Réponse originale
Voici les étapes:
registerElement
exécution native dans une extension chrome. Pour le surmonter, vous devez empêcher l'utilisation du natif registerElement
au profit d'un simulé (le polyfill).Dans webcomponents-lite.js
Commenter le code suivant (et rendez-le plus élégant si vous le souhaitez:
scope.hasNative = false; //Boolean(document.registerElement);
Et voila! le natif registerElement
a maintenant été remplacé par le polyfill - que chrome n'empêche pas d'utiliser au sein d'une extension.
Composants Web Polymer
Vous devrez exécuter le code répertorié dans l'étape ci-dessus et en plus, vous devrez charger le polymère via le code suivant
var link = document.createElement('link');
link.setAttribute('rel', 'import');
link.setAttribute('href', "link_to_your_polymer.html");
link.onload = function() {
// Execute polymer dependent code here
}
UPDATE # 1 - Solution améliorée
Après une enquête plus approfondie, j'ai appris que Polymer ne fonctionnerait pas dans une extension lorsqu'il était chargé dynamiquement. En conséquence, les modifications ci-dessus sont nécessaires. Une alternative plus simple à cela consiste à charger le polymère dans la tête de votre script de contenu comme ceci:
function loadRes(res) {
return new Promise(
function(resolve, reject) {
var link = document.createElement('link');
link.setAttribute('rel', 'import');
link.setAttribute('href', res);
link.onload = function() {
resolve(res);
};
document.head.appendChild(link);
});
}
loadRes( chrome.extension.getURL("path_to_your_webcomponents-lite.js") ) // You may/may not need webcomponents.js here
.then( loadRes( chrome.extension.getURL("path_to_your_polymer.html") ) )
.then( loadRes( chrome.extension.getURL("path_to_your_custome_component") ) )
.then(function(){
// code that depends on web components
});
VOUS DEVEZ ajouter les URL chargées par chrome.extension.getURL
à la web_accessible_resources
partie de votre manifeste.
Ce qui précède est nécessaire car polymer.html doit être chargé via une ressource html. Lire la réponse d'Eric Bidelman ici
Veuillez noter que vous n'aurez peut-être pas besoin du polyfill des composants Web chargé ici si votre composant les charge déjà.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots