我是 Greasemonkey 的新手。我正在尝试创建一个用户脚本来改善我经常访问的网站的用户体验。
所以我想创建一个 javascript 函数 f()
。我的函数需要一个值,根据我的快速研究和尝试理解站点的结构,该值仅存在于 javascript 函数 g()
中。
我不确定服务器上哪个文件包含 g()
,但我知道的是,一旦页面下载完成,g()
可以使用。
我想从 g()
中提取字符串值而不执行它(使用 g.toString()
)。
我的问题是:如何访问 g()
,而不用 unsafeWindow
损害我的计算机?
(window.g
在 Greasemonkey 脚本中返回 null
)。
最佳答案
你必须使用unsafeWindow
。它真的没有那么邪恶。
var string = unsafeWindow.g.toString();
unsafeWindow
相对安全。我之前发现了一种在 GreaseMonkey 中访问不受限制的 window
对象的方法。使用特定的方法,可以通过受影响的页面读取用户脚本的原始代码。但是不能使用特定的 GreaseMonkey 函数(GM_getValue
, ..): Advanced GreaseMonkey: Using constructors/methods/variables at a remote page
编辑,关于标题更改
如果你担心 g
不是一个函数,或者担心函数的 toString
方法被覆盖,使用下面的代码:
//Store unsafeWindow.g in a variable, to reduce the possibly defined
// __defineGetter__ calls to a minimum.
var g_string = unsafeWindow.g;
if(typeof g_string == "function"){
g_string = Function.prototype.toString.call(g_string);
}
else g_string = ""; //Reset
安全吗?
前面的代码是最安全的方法,因为没有调用g
的方法。 GreaseMonkey 包装器还可以防止受影响的页面读取脚本:
window.g = function(){}
window.__defineGetter__("g", function(){
alert(arguments.callee.caller);
});
前面的代码不会显示真正的调用者,而是一个无用的包装函数:
function SJOWContentBoundary() {
[native code]
}
关于javascript - 从页面的函数中提取一个值......没有 unsafeWindow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865772/