有一个页面http://example.com/1.php像往常一样包含javascript文件:
<script type="text/javascript" src="/util.js?1354729400"></script>
此文件包含名为 exampleFunction 的函数,我需要在我的用户脚本中使用该函数。 我还有一个用户脚本:
// ==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!");
}
在Firefox中完美运行并在Chrome中返回错误:
Uncaught ReferenceError: exampleFunction is not defined
如何让它发挥作用?
答案 0 :(得分:9)
exampleFunction
未定义的原因是Chrome用户脚本在沙箱中运行("isolated world")。请注意,Greasemonkey脚本通常也在沙箱中运行,但您的目前正在运行an implicit @grant none
。
如果您的脚本使用GM_
函数,它也将停止在Firefox中运行。
要使此脚本适用于两种浏览器(以及其他一些浏览器),请使用脚本注入 similar to this answer。
然而,还有另一个障碍,因为该脚本正在使用window.onload
。 Chrome userscripts, with the default execution start-mode, will often never see the onload
event.
要解决此问题,请将// @run-at document-end
添加到元数据块。
因此脚本变为:
// ==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);
}
答案 1 :(得分:2)
如果您希望等效于onLoad
,在页面上的所有图像都加载之前不会触发,您希望在元数据块中使用// @run-at document-idle
。加载DOM时会触发默认的document-end,相当于document.ready。
答案 2 :(得分:1)
你试过用括号调用examplefunction吗? :) 像这样:
console.log(exampleFunction());
如果您在chrome控制台中尝试,则必须在调用函数中添加括号。