使用Greasemonkey脚本将其他网站的JavaScript添加到页面中

3

能否使用Greasemonkey脚本将其他网站的JS脚本添加到页面中并使其运行?


可能是重复的问题:通过Greasemonkey直接代码注入包含远程JS文件 - Brock Adams
2个回答

8
你可以简单地创建一个脚本元素并将其添加到文档中。
// ==UserScript==
// @name       My Fancy New Userscript
// @description  enter something useful
// @match      http://*/*
// ==/UserScript==

(function () {
    var scriptElement = document.createElement( "script" );
    scriptElement.type = "text/javascript";
    scriptElement.src = "url to your script";
    document.body.appendChild( scriptElement );
})();

如果您只想运行脚本,那么这就足够了。如果您想在用户脚本中使用类似jQuery的库,则会变得棘手。我知道有两种方法:
- 其中一种是使用Greasemonkey的require标记。 - 另一种需要创建一个与上面显示的脚本元素相同的脚本元素,但需要等待其加载,因此需要scriptElement.onload = function() {},然后您必须使用unsafeWindow来访问库中的变量。
如果这是纯粹的Greasemonkey脚本,我建议使用第一种方法,因为只有这样才能将脚本封装在站点之外。

1
+1 对于 @require。你不需要将这段代码包装在匿名函数中。 - Brock Adams
我可以多次使用变量 scriptElement 来拉取多个外部 JavaScript 文件吗?(例如 script1.js 和 script2.js) - Thomas Ward
此外,有没有办法确定这是否实际执行并将其添加到站点中?因为它为我提取一个脚本,该脚本将从远程.js脚本中提取实时信息和数据,但事实并非如此,因此我想问一下。 - Thomas Ward
1
@Lord 再次更改 src 意味着更改文档中元素的值。我会创建多个带有多个变量的元素,以确保安全。 - Nemo64
我就是这么想的,所以我创建了三个元素:scriptElement1scriptElement2scriptElement3,然后一切都正常了。我也找出了为什么它没有拉取数据的原因——DNS解析出了问题,因为我忘记更新本地DNS服务器信息 xD。 - Thomas Ward
如果我需要从http加载脚本到https,它就无法工作。 - fdrv

0

是的,你可以像这样做:

let script = document.createElement('script');
script.src = "http://example.com/somescript.js";
document.body.appendChild(script);  // execute the script
document.body.removeChild(script);

如果我需要从http加载脚本到https,它就无法工作。 - fdrv
这会始终执行脚本吗?在删除子项之前,是否需要等待执行确认? - Peter Gerdes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接