【问题标题】:Using a Greasemonkey script to add javascript, from other sites, to a page使用 Greasemonkey 脚本将来自其他站点的 javascript 添加到页面
【发布时间】:2017-02-05 02:46:41
【问题描述】:

是否可以使用 Greasemonkey 脚本将 JS 脚本从其他站点添加到页面中,以便它们运行?

【问题讨论】:

标签: javascript greasemonkey


【解决方案1】:

您可以简单地创建一个脚本元素并将其添加到文档中

// ==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 表示@require。您无需将此代码包装在匿名函数中。
  • 我可以重复使用变量scriptElement 多次,以拉入多个外部javascript吗? (如 script1.js 和 script2.js)
  • 另外,有没有办法判断这是否实际执行并将其添加到站点?因为它为我提取了一个脚本,该脚本将从远程 .js 脚本中提取实时信息和数据,而它不是,因此我问。
  • @Lord 再次更改 src 意味着更改文档中元素的值。为了安全起见,我会创建具有多个变量的多个元素。
  • 这就是我的想法,所以我创建了三个元素:scriptElement1scriptElement2scriptElement3,并且一切正常。我弄清楚了为什么它没有提取数据 - DNS 解析失败了,因为我忘记更新本地 DNS 服务器信息 xD
【解决方案2】:

是的,例如,您可以这样做:

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 加载脚本,它不起作用
  • 这会一直执行脚本吗?移除孩子之前不需要等待执行确认吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多