是否将Greasemonkey/Tampermonkey/userscript应用于iframe?

是否将Greasemonkey/Tampermonkey/userscript应用于iframe?,iframe,greasemonkey,userscripts,tampermonkey,Iframe,Greasemonkey,Userscripts,Tampermonkey,标题几乎是一个问题: 是否可以将Greasemonkey脚本添加到iframed网站 如果是,怎么做 谢谢。在Greasemonkey(以及Tampermonkey和大多数用户脚本引擎)中,如果满足、和/或指令,脚本将在iframe上自动启动。 而且,一个流行的问题是 因此,如果您的脚本匹配如下: @match https://fiddle.jshell.net/* 无论JSFIDLE“输出”页面是否出现在iframe中,它都会在这些页面上触发 如果您想在刚制作的iFrame内容上启动: 然

标题几乎是一个问题:

是否可以将Greasemonkey脚本添加到iframed网站

如果是,怎么做

谢谢。

在Greasemonkey(以及Tampermonkey和大多数用户脚本引擎)中,如果满足、和/或指令,脚本将在iframe上自动启动。
而且,一个流行的问题是

因此,如果您的脚本匹配如下:

@match https://fiddle.jshell.net/*
无论JSFIDLE“输出”页面是否出现在iframe中,它都会在这些页面上触发


如果您想在刚制作的iFrame内容上启动: 然后检查
window.self
属性。
例如,假设您的目标页面如下:


我是一些网页,要么是同一个域名,要么不是。
...
然后您可以使用如下脚本:

/==UserScript==
//@name\u专门在domain\u B.com iframes上启动
//@match*://domain\u B.com/somePath/*
//==/UserScript==
if(window.top==window.self){
//---脚本位于domain_B.com上,如果它是主页。
}
否则{
//---脚本位于域_B.com上,如果它位于IFRAME中。
//在这里做你的事。
}

重要: 随着的发布(除此之外,还有许多其他东西被破坏)。
它仍然可以与Tampermonkey、Violentmonkey和几乎每一个用户脚本引擎一起正常工作。

强烈建议()不要使用Greasemonkey 4或更高版本。

请注意,如果要为用户脚本制作chrome扩展,还需要将
“所有帧”:true
添加到清单中,否则扩展将无法在iFrame上工作

清单文件中的示例:

"content_scripts": [
    {
      "matches": ["*://*/*"],
      "all_frames": true,
      "js":["dont.js"],
      "run_at":"document_start"
    }
  ]

示例用例:

这是一种解决方案,适用于
iframe
没有位置触发
@include
@match
的情况

这适用于Greasemonkey 4。

我们必须等待每个帧加载,然后才能对其进行操作。我使用,它等待与给定CSS选择器匹配的元素,就像在中循环匹配一样,然后将给定函数应用于响应:

// ==UserScript==
// @include https://blah.example.com/*
// @require https://git.io/waitForKeyElements.js
// ==/UserScript==

function main(where) {
  // do stuff here with  where  instead of  document
  // e.g. use  where.querySelector()  in place of  document.querySelector()
  // and add stylesheets with  where.head.appendChild(stylesheet)
}

main(document); // run it on the top level document (as normal)

waitForKeyElements("iframe, frame", function(elem) {
  elem.removeAttribute("wfke_found"); // cheat wfke's been_there, use our own
  for (let f=0; f < frames.length; f++) {
    if (!frames[f].document.body.getAttribute("been_there")) {

      main(frames[f].document);

      frames[f].document.body.setAttribute("been_there", 1);
    }
  }
});
/==UserScript==
//@包括https://blah.example.com/*
//@需要https://git.io/waitForKeyElements.js
//==/UserScript==
主功能(其中){
//在此处使用where而不是文档进行操作
//例如,使用where.querySelector()代替document.querySelector()
//并添加带有where.head.appendChild(样式表)的样式表
}
主要(文件);//在顶级文档上运行它(正常情况下)
WaitForkEyements(“iframe,frame”,函数(elem){
elem.removeAttribute(“wfke_found”);//欺骗wfke去过那里,使用我们自己的
对于(设f=0;f
请注意,所选元素只是一个占位符,指示已加载
iframe
。我们从
waitForKeyElements
中删除了“been-there”跟踪器,因为稍后可能会再次加载该帧(我们不能仅使用该
iframe
,因为它的内容会加载到其他位置)

当我们知道一个框架已经加载时,我们循环遍历每一个框架并寻找我们的标记,框架的
主体中的一个HTML属性被称为
(比如
)。如果缺少,我们可以在框架的文档上运行
main()
函数。完成后,我们添加了
been\u there
属性,这样我们就不会再次被触发。

的解决方案对我不起作用,所以我对它做了一些更改。它适用于Greasemonkey 4.10

/==UserScript==
//@包括https://blah.example.com/*
//@需要https://git.io/waitForKeyElements.js
//==/UserScript==
主功能(其中){
//在此处使用where而不是文档进行操作
//例如,使用where.querySelector()代替document.querySelector()
//并添加带有where.head.appendChild(样式表)的样式表
}
主要(文件);//在顶级文档上运行它(正常情况下)
WaitForkEyements(“iframe,frame”,函数(elem){
元素addEventListener(“加载”,函数(){
要素删除属性(“wfke_发现”);
});
主要(要素内容文件);
});

最大的变化是,它现在甚至可以在iframe中导航。

这是一个已知的错误:声明“Greasemonkey 4到今天为止只检测顶级的导航事件,因此它有效地应用于每个脚本。”请注意,这在Greasemonkey 4Thanks中,@Mathnerd314。更新了答案。请注意,GM4现在有一个单独的标签,以区别于运行良好的GM版本。Greasemonkey似乎并不建议您不要使用4或更高版本。他们只是告知它破坏了向后兼容性。我可以证实,这也适用于Tampermonkey的Goggle Chrome,与原始答案相比,它看起来更优雅。非常感谢,这真的很有帮助!