我是Greasemonkey的新手。我正在尝试创建一个用户脚本,以改善我经常访问的网站的用户体验。
所以我想创建一个javascript函数f()
。我的函数需要一个值,根据我的快速研究并尝试理解网站的结构,只存在于javascript函数g()
中。
我不确定哪个文件在服务器上保留g()
,但我知道的是,一旦页面下载完毕,就可以使用g()
。
我想从g()
中提取字符串值而不执行它(使用g.toString()
)。
我的问题是:如何在不使用g()
来破坏我的计算机的情况下访问unsafeWindow
?
(window.g
在Greasemonkey脚本中返回null
。
答案 0 :(得分:1)
您必须使用unsafeWindow
。这真的不是那么邪恶。
var string = unsafeWindow.g.toString();
unsafeWindow
相对安全。我之前发现了一种在GreaseMonkey中访问不受限制的window
对象的方法。使用特定方法,可以通过受影响的页面读取Userscript的原始代码。但是不能使用特定的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]
}