gpt4 book ai didi

javascript - 从 Chrome 上的 Greasemonkey 脚本将 JS 函数注入(inject)页面

转载 作者:IT王子 更新时间:2023-10-29 03:10:04 26 4
gpt4 key购买 nike

我有一个在 Firefox 和 Opera 中运行良好的 Greasemonkey 脚本。然而,我很难让它在 Chrome 中运行。问题是将一个函数注入(inject)到页面中,该函数可以被页面中的代码调用。这是我目前所做的:

首先,我获得了对 unsafeWindow 的帮助引用对于火狐。这使我可以为 FF 和 Opera(我认为还有 Chrome)使用相同的代码。

var uw = (this.unsafeWindow) ? this.unsafeWindow : window;

接下来,我将一个函数注入(inject)到页面中。它实际上只是一个非常薄的包装器,除了在我的 GM 脚本的上下文中调用相应的函数外什么都不做:

uw.setConfigOption = function(newValue) {
setTimeout(setConfigOption, 0, newValue);
}

然后,我的脚本中就有相应的函数:

setConfigOption = function(newValue) {
// do something with it, e.g. store in localStorage
}

最后,我将一些 HTML 注入(inject)到页面中,其中包含调用该函数的链接。

var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);

总结一下:在 Firefox 中,当用户单击那个注入(inject)的链接时,它将在 unsafeWindow 上执行函数调用,然后触发超时,在我的 GM 脚本的上下文中调用相应的函数,然后进行实际处理。 (如果我在这里错了,请纠正我。)

在 Chrome 中,我只收到“ Uncaught ReferenceError :setConfigOption 未定义”错误。事实上,在控制台中输入“window.setConfigOption”会产生“undefined”。在 Firebug 和 Opera 开发人员控制台中,该函数就在那里。

也许还有另一种方法可以做到这一点,但我的一些函数是由页面上的 Flash 对象调用的,我认为这使得我必须在页面上下文中拥有函数。

我快速浏览了 alternatives to unsafeWindow在 Greasemonkey wiki 上,但它们看起来都很丑陋。我在这里完全走错了路还是应该更仔细地研究这些?

解决方案: 我遵循了 Max S.' advice它现在可以在 Firefox 和 Chrome 中使用。因为我需要对页面可用的函数必须回调到常规函数中,所以我将整个脚本移到了页面中,即它完全包含在他称为“main()”的函数中。

为了让那个 hack 的额外丑陋变得更加可以忍受,我现在至少可以放弃使用 unsafeWindow 和 wrappedJSObject。

我还是没能得到 content scope runner来自 Greasemonkey 维基工作。它应该做同样的事情并且看起来执行得很好,但我的功能永远无法访问 <a>例如,页面中的元素。我还没有弄清楚为什么会这样。

最佳答案

与 Chrome 页面上运行的代码进行通信的唯一方法是通过 DOM,因此您必须使用 hack,例如插入 <script>用你的代码标记。请注意,如果您的脚本需要在页面上的其他所有内容之前运行,这可能会证明存在错误。

编辑 the Nice Alert extension 是这样的这样做:

function main () {
// ...
window.alert = function() {/* ... */};
// ...
}

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);

关于javascript - 从 Chrome 上的 Greasemonkey 脚本将 JS 函数注入(inject)页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com