Window.onload fonctionne dans le script Firefox + Greasemonkey mais pas dans un utilisateur utilisateur Chrome?

Il y a une page http://example.com/1.php qui inclut le fichier javascript comme d'habitude:

<script type="text/javascript" src="/util.js?1354729400"></script> 

Ce fichier contient la fonction nommée exampleFunction que je dois utiliser dans mon fichier userscript. J'ai également un script utilisateur:

 // ==UserScript== // @name SomeName // @namespace http://example.com/userscripts // @description Greets the world // @include http://example.com/* // ==/UserScript== window.onload = function () { console.log(exampleFunction); alert("LOADED!"); } 

Qui fonctionne parfaitement dans Firefox et renvoie une erreur dans Chrome:

 Uncaught ReferenceError: exampleFunction is not defined 

Comment le faire fonctionner?

La raison pour laquelle exampleFunction était indéfinie, c'est parce que les utilisateurs de Chrome fonctionnent dans un sandbox ( "monde isolé" ). Notez que les scripts Greasemonkey fonctionnent souvent dans un bac à sable, mais le vôtre fonctionne actuellement avec un @grant none implicite .
Si votre script devait utiliser une fonction GM_ , cela empêcherait de travailler aussi sur Firefox.

Pour que ce script fonctionne sur les deux navigateurs (et quelques autres aussi), utilisez Script Injection similaire à cette réponse .

Cependant , il y a un autre problème, puisque ce script utilise window.onload . Les scripts d'utilisateurs Chrome, avec le mode de début d'exécution par défaut, ne verront souvent jamais l'événement onload .

Pour contourner cela, ajoutez // @run-at document-end au bloc de métadonnées.

Ainsi, le script devient:

 // ==UserScript== // @name SomeName // @namespace http://example.com/userscripts // @description Greets the world // @include http://example.com/* // @run-at document-end // @grant none // ==/UserScript== function GM_main () { window.onload = function () { console.log(exampleFunction); alert("LOADED!"); } } addJS_Node (null, null, GM_main); //-- This is a standard-ish utility function: function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement ('script'); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); } 

Avez-vous essayé d'appeler la fonction exemple avec des parenthèses? 🙂 Comme ça:

 console.log(exampleFunction()); 

Si vous l'essayez dans la console chrome, vous devez ajouter des brackets à la fonction d'appel.

Si vous voulez l'équivalent de onLoad , qui ne déclenche que lorsque toutes les images de la page sont chargées, vous souhaitez utiliser // @run-at document-idle in // @run-at document-idle dans votre bloc de métadonnées. La valeur par défaut, la fin du document, se déclenche lorsque le DOM est chargé, l'équivalent de document.ready.