1

Actuellement, je suis en train de créer une extension Chrome. Pour cela, j'ai besoin d'utiliser l'API Data Calendar de Google. Voici mon fichier manifest.json:Extensions Chrome et chargement des API Google externes Uncaught ReferenceError

{ 
"name": "Test", 
"version": "1.0", 
"background_page": "background.html", 
"content_scripts": [ 
    { 
    "matches": ["<all_urls>"], 
    "js": ["jquery.js", "content_script.js"] 
    } 
], 
"permissions": [ 
    "tabs", "http://*/*" 
] 

}

J'ai essayé d'ajouter ce qui suit à la partie js du fichier manifeste, mais qui jette une erreur lors du chargement de l'extension.

http://www.google.com/jsapi?key=keyhere 

J'ai aussi essayé d'ajouter

document.write('<script type="text/javascript" src="http://www.google.com/jsapi?key=keyhere"></script>'); 

à mon dossier background.html. Cependant, chaque fois que j'appelle

google.load("gdata", "1"); 

Je reçois une erreur qui indique Uncaught ReferenceError: google n'est pas défini. Pourquoi mon extension ne charge-t-elle pas cette API quand elle charge les autres?

Répondre

1

Vous ne pouvez pas inclure de script externe dans content_scripts.

Si vous voulez injecter étiquette <script> utilisant document.write alors vous devez masquer slash dans une balise de fermeture:

document.write('...<\/script>'); 

Vous pouvez inclure vos api externes js dans la page de fond comme d'habitude bien:

<script type="text/javascript" src="http://www.google.com/jsapi?key=keyhere"></script> 

Si vous avez besoin de cette API dans les scripts de contenu, vous pouvez envoyer une requête à votre page d'arrière-plan et lui demander de faire des tâches dépendantes de l'API, puis renvoyer un résultat à votre script de contenu.

+0

J'ai essayé de l'ajouter normalement dans la page d'arrière-plan, et cela ne fonctionne pas non plus. J'en ai besoin dans content_scripts, mais je pensais que le charger dans background.html me permettrait automatiquement de l'utiliser dans content_scripts. – joshholat

+0

@joshholat Page d'arrière-plan est à peu près juste une page normale sans aucune restriction. Si cela ne fonctionne pas, le problème est dans le code. Mettez votre page d'arrière-plan dans le serveur Web racine et ouvrez-le dans un navigateur - je parie que cela ne fonctionnerait pas non plus. – serg

+0

La mise en page d'arrière-plan d'api js ne la charge pas automatiquement dans les scripts de contenu, ils sont complètement isolés. Pour pouvoir communiquer entre eux, vous devez envoyer des demandes. – serg

0

Merci pour ce lien, cela m'a beaucoup aidé. Cependant, maintenant j'ai rencontré un autre problème intéressant.

for (var i = rangeArray.length - 1; i >= 0; i--) { 
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','helloThere();'); 
    myLink.innerText ="GO"; 
    rangeArray[i].insertNode(myLink); 
} 

Maintenant je l'erreur, « helloThere n'est pas défini », même si je posai cette fonction une dizaine de lignes au-dessus de la fonction actuelle qui a la boucle au-dessus dans le même fichier. Pourquoi cela pourrait-il se produire? Et si je fais:

for (var i = rangeArray.length - 1; i >= 0; i--) { 
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','chrome.extension.sendRequest({greeting: "hello"}, function(response) { });'); 
    myLink.innerText ="GO"; 
    rangeArray[i].insertNode(myLink); 
} 

Je reçois TypeError Uncaught: Impossible d'appeler la méthode « sendRequest » undefined

+0

Il serait probablement préférable de le mettre comme une autre question car elle n'est pas liée. Le script de contenu et la page réelle ne partagent pas l'espace des variables, ils ne partagent que le DOM. – serg

+0

N'utilisez pas de chaînes, utilisez des références de fonction. Au lieu de 'myLink.setAttribute ('onclick', 'helloThere();');' dire 'myLink.onclick = helloThere' –

0

Ceci est parce qu'il ya une erreur de syntaxe dans votre code. J'ai eu le même problème. J'ai ouvert ma page background.html dans fire fox avec le plug-in fire-bug activé. Fire-bug console devrait moi l'erreur, j'ai corrigé et cela fonctionne maintenant.

Questions connexes