【问题标题】:Using external javascript code to run a snippet on the Chrome console使用外部 javascript 代码在 Chrome 控制台上运行代码段
【发布时间】:2021-02-02 22:18:12
【问题描述】:

是否可以在外部 javascript 代码(例如,通过 tampermonkey 的用户脚本)中在 Chrome 控制台上运行代码 sn-p。例如,console.log 将文本打印到控制台。是否有某种方式,例如函数 console.eval 或更复杂的方式,我可以在控制台上运行代码 而无需在给定网站上手动打开它,而是使用网站背后的原始 javascript 代码或用户脚本?

注意:我在 Windows 10 上使用 Google Chrome。最好这个答案应该尽可能普遍适用,但对我来说,首要任务是让它在我的环境中工作。

谢谢,

迈克

【问题讨论】:

  • 你的最终目标是什么?您可以尝试通过扩展程序使用 devtools api,还是仅限于页面中的常规 javascript?
  • 碰巧有一段代码可以在控制台中运行,但不能在用户脚本本身中运行。使用querySelector 进行非常基本的 DOM 检索,然后更改样式,但基于 DOM 结构(iframe),代码只能在控制台中运行,所以如果我可以通过我的用户脚本在控制台上运行 sn-p 代码,那样就好了。 (页面不断地重新加载,所以每次都复制粘贴代码是不切实际的)。
  • 好的,现在我们有一个完全不同的问题。现在你说你想要一个用户脚本从自己/其他域的内部/外部 iframe 访问 dom。会是哪一个?内部或外部 iframe?本地还是远程?我建议打开另一个问题,因为答案与问题标题如此不同,下一个有相同疑问的人不会阅读问题/答案,因为它们是无关的。
  • 我认为你误解了我想要的东西。我只是希望能够从我的用户脚本在 chrome 控制台上运行一个 sn-p 代码。
  • 如果页面不断重新加载,你想到的“控制台”也会重新加载??

标签: javascript google-chrome console


【解决方案1】:

英国,当我说if the page is reloading constantly, the "console" that u think of would also reload?? 时,我们很多人都知道我在下面做什么(如果不是我们所有人),但我最终将它与你的问题联系起来。 使用一个标签控制另一个标签

ONE EDIT:我使用interval 来确定受控选项卡是否CLOSED(因为某个值最终会改变,如果标签已永久关闭

如何使用

  1. 打开与所需 url 具有相同来源的选项卡(但不是不断重新加载的站点)..
    例如如果所需的 url 是“https://example.com”,则在“https://example.com/404”上打开一个选项卡是所需的 url(不断重新加载一个)
  2. 在我下面的代码sn-p中,您可以将标签控制代码放在loadFn函数中,其中myWindowthis指向受控标签的window
    例如loadFn 函数中,myWindow.console.log(1)this.console.log(1) 都会将1 记录到受控选项卡的控制台


第二次编辑:我将解释它是如何工作的(并按照您在 cmets 中的要求谈论 unloadFn
我使用unloadload 的组合监听能够重复发送代码"on reload" 这本身不是一个事件,所以我必须创建它。如果我没有解释自己,我现在会详细说明..
当页面重新加载时(或者当我只是生成页面时,例如var myWindow=window.open(desiredUrl)),unload 事件会发生。但是只有一个问题;每次重新加载页面时,所有事件侦听器和您放置的任何代码都会被删除(因为 reload 会卸载到 then reload
解决方案很简单:在每个unload 上,我再次设置监听器,由于函数会调用自身(每次页面卸载),监听器每次都会成功重新加载页面重新加载(这就是为什么loadFn 可以在每次重新加载后在另一个选项卡中运行)
注意:您可能会问“为什么要使用setTimeout?”。实际上它非常重要。如果没有setTimeout,事件侦听器请勿添加,我认为这是因为选项卡会忽略您的命令(因为它将专注于加载其默认内容(例如事件侦听器)) , 而asynchronous programming 在这种情况下会产生奇迹,因为它会等到其他东西被处理(比如事件处理的东西)然后运行
旁注:如果这不是setTimeout 有效而不使用无效的原因,我所知道的是,没有它,它就无效,有了它,它就可以工作了


var myWindow=window.open(desiredUrl) //remember to run this code on the same origin as the desiredUrl
function loadFn(){
  //this will happen every time myWindow loads or reloads
  myWindow.alert("It runs in the controlled tab")
  myWindow.console.log("Even in the controlled tab's console it works >:D")
}
function unloadFn(){setTimeout(()=>{
  myWindow.addEventListener('unload',unloadFn)
  myWindow.addEventListener('load',loadFn)
  if(!myWindow.Window){console.warn("myWindow was CLOSED")}
},0)}
myWindow.addEventListener('unload',unloadFn)
//extra thing below to tell if controlled tab is closed >:D
var i=setInterval(()=>{
  //for if controlled tab is closed
  if(!myWindow.document.location){clearInterval(i);console.warn("myWindow was CLOSED")}
},0)

【讨论】:

  • 很好的解决方案,只是几个问题 --- 卸载功能是做什么的?其次,我想在不断重新加载页面的控制台中运行代码。如何使用控制重新加载页面的控制台的页面来运行代码?谢谢。
  • 澄清:运行代码控制页面的控制台
  • @MikeSmith 我刚刚编辑了这个问题,试图在这里回答这些问题。如果阅读量很大,下面的评论在没有上下文的情况下解释了unloadFn
  • 解决方案很简单:在每个unload 上,我再次设置监听器,因为函数会调用自身(每次页面卸载),监听器会每次重新加载页面时都会成功重新加载(这就是为什么 loadFn 可以在每次重新加载后在另一个选项卡中运行)
  • @MikeSmith 还有一件事.. 至于在受控选项卡的控制台上运行代码,您的意思是否相当于在选项卡的控制台中粘贴代码然后按 Enter 键?如果是这样,loadFn 中的myWindow.eval(stringVersionOfCopiedCode) 就可以解决问题。还请记住,您可以将myWindow 视为受控选项卡的window。如果我所说的没有帮助,您能否分享一个示例来说明在受控页面的控制台中运行代码 的含义?
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多