在 Chrome 控制台上使用外部 javascript 代码 运行 片段

Using external javascript code to run a snippet on the Chrome console

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

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

谢谢,

麦克

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

一次编辑:我使用interval来确定受控选项卡是否已关闭(因为某个值最终 如果选项卡永久关闭)

会发生变化

如何使用:

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


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


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)