window.onload works in Firefox+Greasemonkey script but not in a Chrome userscript?
The reason that exampleFunction
was undefined is because Chrome userscripts operate in a sandbox ("isolated world"). Note that Greasemonkey scripts often operate in a sandbox too, but yours is currently running with an implicit @grant none
.
If your script were to use a GM_
function, it would stop working in Firefox too.
To make this script work on both browsers (and a few others, as well), use Script Injection similar to this answer.
However, there is another hitch, since that script is using window.onload
. Chrome userscripts, with the default execution start-mode, will often never see the onload
event.
To get around that, add // @run-at document-end
to the metadata block.
So the script becomes:
// ==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);}
If you want the equivalent to onLoad
, which doesn't fire till all images on the page are loaded, you want to use // @run-at document-idle
in your metadata block. The default, document-end, fires when the DOM is loaded, the equivalent of document.ready.
Have you tried calling examplefunction with brackets ? :)Like this:
console.log(exampleFunction());
If you try it in chrome console, you have to add brackets to call function.