使用外部javascript代码在Chrome控制台上运行代码段
是否可以在外部javascript代码(例如,通过tampermonkey的用户脚本)中在Chrome控制台上运行代码片段。例如,使用外部javascript代码在Chrome控制台上运行代码段,javascript,google-chrome,console,Javascript,Google Chrome,Console,是否可以在外部javascript代码(例如,通过tampermonkey的用户脚本)中在Chrome控制台上运行代码片段。例如,console.log将文本打印到控制台。有没有什么方法,比如函数console.eval或者更复杂的方法,我可以在控制台上运行代码,而不必在给定的网站上手动打开,而是使用网站背后的原始javascript代码或用户脚本 注意:我在Windows10上使用谷歌浏览器。最好这个答案应该尽可能普遍适用,但对我来说,首要的任务是让它在我的环境中工作 谢谢 MikeUk,当我
console.log
将文本打印到控制台。有没有什么方法,比如函数console.eval
或者更复杂的方法,我可以在控制台上运行代码,而不必在给定的网站上手动打开,而是使用网站背后的原始javascript代码或用户脚本
注意:我在Windows10上使用谷歌浏览器。最好这个答案应该尽可能普遍适用,但对我来说,首要的任务是让它在我的环境中工作
谢谢
MikeUk,当我说
如果页面不断重新加载,你想到的“控制台”也会重新加载???
时,我们很多人都知道我下面在做什么(如果不是我们所有人的话),但我最后把它与你的问题联系起来使用一个选项卡控制另一个选项卡
一次编辑:我使用了间隔
来确定受控选项卡是否关闭(因为如果选项卡永久关闭,某个值最终会改变)
如何使用:
例如:打开“上的选项卡”https://example.com/404“如果所需的url为”https://example.com“是所需的url(不断重新加载的url)
loadFn
函数中,其中myWindow
和this
指向受控选项卡的窗口
eg:在
loadFn
功能中,myWindow.console.log(1)
或this.console.log(1)
都会将1
记录到受控选项卡的控制台第二次编辑:我将解释它是如何工作的(并按照您在评论中的要求谈论
卸载fn
)
我使用了
卸载
和加载
监听的组合,以便能够反复发送代码“重新加载时”
,这本身不是一个事件,因此我必须创建它。如果我没有解释我自己的话,我现在就详细谈谈。。
当一个页面正在重新加载时(或者当我正在生成该页面时,例如:
var myWindow=window.open(desiredUrl)
),就会发生unload
事件。然而,只有一个问题;每次重新加载页面时,所有事件侦听器和您放置的任何代码都将被删除(因为重载将卸载到然后重载)
解决方案很简单:在每次
卸载
时,我都会再次设置listeners,因为函数会调用自身(每次页面卸载),所以每次页面重新加载时,监听器都会成功地重新加载(这就是为什么每次重新加载后,loadFn
可以在另一个选项卡中运行的原因)
注意事项:您可能会问“为什么要使用
setTimeout
?”。实际上,它非常重要。如果没有setTimeout
,事件侦听器就不会被添加,我认为这是因为该选项卡会忽略您的命令(因为它会专注于加载其默认内容(例如事件侦听器)),而异步编程
在这种情况下确实很神奇,因为它会等到处理完其他东西(比如事件处理的东西)之后才运行
旁注:如果这不是
setTimeout
工作而不使用它的原因,我所知道的是,没有它,它就不工作,有了它,它就工作了
你的最终目标是什么?您是否可以尝试通过扩展使用devtoolsapi,或者您只能使用页面中的常规javascript?这里碰巧有一段代码在控制台中工作,但在userscript本身中不工作。使用
querySelector
进行非常基本的DOM检索,然后更改样式,但是基于DOM结构(iframe),代码只能在控制台中工作,因此如果我可以通过我的userscript在控制台上运行一段代码,那就太好了。(页面不断地重新加载,所以每次复制粘贴代码是不可能的)。好的,现在我们有一个完全不同的问题。现在您说您想让一个用户脚本从自己/其他域的内部/外部iframe访问dom。那会是哪一个?内部iframe还是外部iframe?本地还是远程?我建议你打开另一个问题,因为答案与问题标题如此不同,以至于下一个有同样疑问的人不会阅读这些问题/答案,因为它们是无关的。我想你误解了我的意思。我只是希望能够在chrome控制台上从我的用户脚本运行一段代码。如果页面不断重新加载,你想到的“控制台”也会重新加载??很好的解决方案,只是几个问题——卸载函数做什么?其次,我想在不断重新加载页面的控制台中运行代码。如何使用控制重新加载页面控制台的页面来运行代码?谢谢。澄清:运行受控页面的console@MikeSmith我刚刚编辑了这个问题,试图在这里回答这些问题。。此外,如果这是一个大的阅读,下面的注释解释了没有上下文的unload fn
。解决方案很简单:在每个unload
,我都会再次设置listeners,因为函数会调用自己(每次页面卸载),所以每次页面重新加载时都会成功地重新加载侦听器(这就是为什么每次重新加载后,loadFn
都可以在另一个选项卡中运行)@MikeSmith还有一件事..至于在受控选项卡的控制台上运行代码,你的意思是等同于在选项卡的控制台中粘贴代码,然后按enter键吗?如果是这样,myWindow.eval(stringVersionOfCopiedCode)
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)