javascript - 从页面的函数中提取一个值......没有 unsafeWindow?

标签 javascript greasemonkey

我是 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/

相关文章:

javascript - XPath 无法单击 Greasemonkey 脚本中的按钮

javascript - 如何用 Tampermonkey 替换弹出窗口的 HTML 代码?

javascript - 无法在 Firefox 中的 Window 上监听 DOMMouseScroll

javascript - Angular Directive(指令)未被调用

javascript - 在 JavaScript 中合并两个字符串映射

javascript - AngularJS 中 Session Storage、Local Storage 和 Cookies 的区别

javascript - 验证可以添加或删除字段的动态表单

javascript - 无法使用 firebug 或 firefox 调试器调试 greasemonkey 脚本

jquery - 通过浏览器扩展添加表值

jquery - 元素的 CSS,在页面加载结束时还原?